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;
}
效果: