PHP自定義數組轉Json字符串函數

                                                                   PHP自定義數組轉Json字符串函數

一、前言:這個函數無實際用途,寫來練手的。

二、PHP默認數組,json互轉 函數

$array = ['中文', 1, '999', true, null, -1];
$string = json_encode($array);
$string1 = json_encode($array, JSON_UNESCAPED_UNICODE); //中文不轉碼

$array = json_decode($string, true);
$array1 = json_decode($string1, true);

echo $string . '<br/>';
echo $string1 . '<br/>';
var_export($array);
echo '<br/>';
var_export($array1);
die;

打印:

三、我自己寫的函數

function testa(){
        $array = [
            0,
            12,
            'a',
            'b' => 18,
            'c' => 'd',
            18 => 'e',
            true,
            false,
            NULL,
            60 => -99,
            -7 => 999,
            61 => false,
            62 => -1,
            63 => null,
            64 => '',
            65 => 0
        ];
        $array1 = [1, '999', null, false, true, -999, 999999999];
        $array2 = [$array, $array1];
        $array3 = [[$array, $array1], $array2];
        $array4 = [$array3, $array, [$array2, [$array3]]];

        $data = [$array, $array1, $array2, $array3, $array4];
        foreach ($data as $value){
            $phpValue = json_encode($value, JSON_UNESCAPED_UNICODE);
            echo  "<span style='color:green'>{$phpValue}</span><br/>";

            $string = '';   //重置結果
            $this->toJson($value,  $string);
            echo $string . '<br/><br/>';
        }
        die;
    }

    /**
     * 把數組轉爲Json,遞歸處理
     * @param $array 待處理的數組
     * @param $string 引用傳遞
     */
    function toJson($array, &$string){
        $haveKeys = $this->haveKeys($array);
        $string .= $haveKeys ? '{' : '[';   //最外圍的開始符號拼接
        $i = 0;
        foreach ($array as $key => $value){
            $isLast = ($i==(count($array)-1)) ? true : false;   //是否是最後一個元素
            if (is_array($value)){
                $string .= $haveKeys ? '"'. $key .'":' : '';    //處理數組的鍵
                $this->toJson($value, $string);              //處理單個數組的內容(值)
                $string .= $isLast ? '' : ',';                  //如果不是最後一個元素,要加上英文逗號,
            }else{
                $split = $isLast ? '' : ',';    //如果不是最後一個元素,要加上英文逗號,
                $value = $this->handleValue($value);
                $string .= $haveKeys ? '"' . $key . '":' . $value . $split : $value . $split;
            }
            $i++;
        }
        $string .= $haveKeys ? '}' : ']';   //最外圍的結束符號拼接
    }

    /**
     * 數組是否有自定義鍵:判斷內容是用 {} 還是用 [] 包裹
     * @param $array 待判斷的數組
     * @return bool true:有自定義鍵;false:沒有自定義鍵
     */
    function haveKeys($array){
        $flag = false;
        $keys = array_keys($array);
        foreach ($keys as $k => $v){
            if ($k !== $v){
                $flag = true;
                break;
            }
        }
        return $flag;
    }

    /**
     * 根據值的類型處理值(賦值|強轉)
     * 注:可能還要其他數據類型,我漏掉了的,根據實際情況處理類型
     * @param $value
     * @return string
     */
    function handleValue($value){
        $type = gettype($value);
        switch ($type){
            case 'NULL':    //默認輸出空,這裏要處理成字符串 null 返回
                $string = 'null';
                break;
            case 'boolean': //默認true輸出1,false輸出空,這裏要處理成字符串 (false|true) 返回
                $string = ($value==1) ? 'true' : 'false';
                break;
            case 'string':  //給字符串加上雙引號
                $string = '"' . $value . '"';
                break;
            default:        //強轉成對應的類型
                settype($value, $type); //設置字段類型
                $string = $value;
                break;
        }
        return $string;
    }

效果:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章