json 格式化打印

想练手的可以手写一个出来,比如

<?php
class Helper{
    public static function jsonFormat($data, $indent=null){
        // 对数组中每个元素递归进行urlencode操作,保护中文字符
        array_walk_recursive($data, [self::class,'jsonFormatProtect']);

        // json encode
        $data = json_encode($data);

        // 将urlencode的内容进行urldecode
        $data = urldecode($data);

        // 缩进处理
        $ret = '';
        $pos = 0;
        $length = strlen($data);
        $indent = isset($indent)? $indent : '    ';
        $newline = PHP_EOL;
        $prevchar = '';
        $outofquotes = true;

        for($i=0; $i<=$length; $i++){

            $char = substr($data, $i, 1);

            if($char=='"' && $prevchar!='\\'){
                $outofquotes = !$outofquotes;
            }elseif(($char=='}' || $char==']') && $outofquotes){
                $ret .= $newline;
                $pos --;
                for($j=0; $j<$pos; $j++){
                    $ret .= $indent;
                }
            }

            $ret .= $char;

            if(($char==',' || $char=='{' || $char=='[') && $outofquotes){
                $ret .= $newline;
                if($char=='{' || $char=='['){
                    $pos ++;
                }

                for($j=0; $j<$pos; $j++){
                    $ret .= $indent;
                }
            }

            $prevchar = $char;
        }

        return $ret;
    }

    public static function jsonFormatProtect(&$val){
        if($val!==true && $val!==false && $val!==null){
            $val = urlencode($val);
        }
    }
}

$array = [
  'key1' => 123,
  'key2' => 'abc',
  'key3' => '中文测试'
];

$json = Helper::jsonFormat($array);
echo '</pre>';
print_r($json);

转自博客 原文

还有一种方法就是使用 json_encode() 函数,它再不断的添加参数来丰富它的功能,上面同样的操作可以简化成这样:

<?php
$array = [
  'key1' => 123,
  'key2' => 'abc',
  'key3' => '中文测试'
];

$json = json_encode($$array, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK);
echo '</pre>';
print_r($json);

想知道 json_encode更多的参数可以看文档 文档地址

标签: none

添加新评论