首頁 > 後端開發 > php教程 > 深入淺析php json 格式控制

深入淺析php json 格式控制

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
發布: 2016-07-29 09:09:14
原創
732 人瀏覽過

關於json 這個問題,陸陸續續有新手朋友找我問,例如為什麼我輸出的是{"1":"item1","2":"item2","3":"item3"} 而不是[ "item1","item2","item3"]。

php陣列 與 js陣列

我這裡用 php 5.4 以上文法表示。

php 裡有關聯數組和索引數組,例如:

<&#63;php
// 索引数组
$arr = ['item1', 'item2', 'item3'];
// 关联数组
$arr = [
 'name' => '张三',
 'age' => '22',
]; 
登入後複製

而js 裡只有一種數組,那就是索引數組,也許你會說可以用K/V 鍵值對形式模擬關聯數組啊。

 K/V 鍵值物件看起來像,但他沒有任何陣列特性,這裡就不詳細說明了。

而上面的 php 陣列 json_encode 後得到的 json 格式分別是 ["item1","item2","item3"] 和 {"name":"u5f20u4e09","age":"22"}。這裡的中文被轉為Unicode 了,如果你非要顯示中文,php 5.4 之後支援JSON_UNESCAPED_UNICODE 參數,json_encode($arr, JSON_UNESCAPED_UNICODE) 即可得到{"name":"張三","age":"22" },不過非常不推薦這樣寫。

這裡分別得到的是 js 下的 數組 和 物件 格式的 json 字串,那為什麼會產生這兩種類型,或者說,什麼情況會產生物件格式,什麼情況會產生數組格式呢。

php 陣列 輸出格式控制

大致幾種情況我都列出來了,直接看程式碼。

<&#63;php
$arr = [ // 不是 0 开始,会输出对象
 1 => 'item1',
 2 => 'item2',
 3 => 'item3',
];
echo "输出对象: ", json_encode($arr), "\n";
// 输出对象: {"1":"item1","2":"item2","3":"item3"}
$arr = [ // 连续索引,输出数组
 0 => 'item1',
 1 => 'item2',
 2 => 'item3',
];
echo "输出数组: ", json_encode($arr), "\n";
// 输出数组: ["item1","item2","item3"]
$arr = [ // 连续索引,输出数组 
 'item1',
 'item2',
 'item3',
];
echo "输出数组: ", json_encode($arr), "\n";
// 输出数组: ["item1","item2","item3"]
$arr = [ // 索引不连续,输出对象
 0 => 'item1',
 1 => 'item2',
 2 => 'item3',
 5 => 'item5',
];
echo "输出对象: ", json_encode($arr), "\n";
// 输出对象: {"0":"item1","1":"item2","2":"item3","5":"item5"}
$arr = [ // 包含关联索引,一定输出对象
 0 => 'item1',
 1 => 'item2',
 2 => 'item3',
 'other' => '其他字段'
];
echo "输出对象: ", json_encode($arr), "\n";
// 输出对象: {"0":"item1","1":"item2","2":"item3","other":"\u5176\u4ed6\u5b57\u6bb5"}
// 关联数组 + 索引数组 实例
$arr = [ // 关联数组
 'other' => '其他字段',
 'count' => 3, // 数组个数
 'list' => [ // 索引数组
  'item1',
  'item2',
  'item3',
 ],
];
echo "对象+数组: ", json_encode($arr), "\n";
// 对象+数组: {"other":"\u5176\u4ed6\u5b57\u6bb5","count":3,"list":["item1","item2","item3"]} 
登入後複製

其實第一種就是許多新手朋友常遇到的問題。

 因為資料庫讀出來後他們喜歡把 id 當索引用,而資料庫的 id 不是從 0 開始的,看下這個例子。

$arr = $User->where($where)->find(); // 读取数据
$list = [];
foreach($arr as $key => $val) { // 遍历数组
 $list[$key] = [
  'name' => $val['name'],
  'age' => $val['age'],
 ];
}
$list['count'] = count($arr); // 其他属性
echo json_encode($list); // 输出 json
// {"1":{"name":"zhangsan","age":22},"2":{"name":"lisi","age":25},"count":2} 
登入後複製

而最後一種是比較常用的寫法,自訂欄位和陣列一起用,來修改下剛才範例。

$arr = $User->where($where)->find(); // 读取数据
$list = [];
foreach($arr as $key => $val) { // 遍历数组
 $list['list'][] = [ // 修改这里
  'name' => $val['name'],
  'age' => $val['age'],
 ];
}
$list['count'] = count($arr); // 其他属性
echo json_encode($list); // 输出 json
// {"list":[{"name":"zhangsan","age":22},{"name":"lisi","age":25}],"count":2} 
登入後複製

希望對大家學習php json 格式控制相關知識有幫助。謝謝大家一直以來對本站網站的支持。

以上就介紹了深入淺析php json 格式控制,包括了方面的內容,希望對PHP教程有興趣的朋友有幫助。

相關標籤:
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板