php數(shù)組轉(zhuǎn)化成json的數(shù)據(jù)格式不是數(shù)組套對(duì)象而是對(duì)象套對(duì)象是怎么回事?
php為什么打印時(shí)是數(shù)組格式,但是轉(zhuǎn)json格式以后存入數(shù)據(jù)庫(kù)就成了對(duì)象形式?
問題如下:
$arr = array('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);
echo json_encode($arr);
輸出:{“a”:1,”b”:2,”c”:3,”d”:4,”e”:5}
此時(shí)數(shù)組格式的數(shù)據(jù)被轉(zhuǎn)換成了對(duì)象類型
如果是索引數(shù)組或者空數(shù)組,則輸出為數(shù)組形式。
另一種情況是雖然是索引數(shù)組,但依然有時(shí)候會(huì)被轉(zhuǎn)換成對(duì)象形式,這就邪門了,這是在菜單權(quán)限勾選時(shí)候踩的坑,如果我們連續(xù)勾選權(quán)限例如第一項(xiàng)第二項(xiàng)第三項(xiàng),但是如果跳過一下,這樣返回后臺(tái)接口的數(shù)據(jù),就是一個(gè)索引不連續(xù)的數(shù)組,這時(shí)候會(huì)被轉(zhuǎn)換成對(duì)象形式,然后在獲取的時(shí)候,造成了數(shù)據(jù)不統(tǒng)一從而報(bào)錯(cuò)。
所有后端需要給傳遞過來的數(shù)組sort重新排序一下或者只取出鍵或者值部分,這樣生成新的數(shù)組就是連續(xù)的鍵值對(duì)。json之后依然保持?jǐn)?shù)組的形態(tài)的字符串。
如果是api返回給前端的json數(shù)據(jù),你需要保證的你的數(shù)組索引是連續(xù)的數(shù)字索引,需要使用array_values。如果需要的內(nèi)容在鍵中也可以使用array_keys
下面來詳細(xì)介紹一下為什么會(huì)出現(xiàn)這種情況?
數(shù)組”(array)和“對(duì)象”(object)兩者都可以用來表示數(shù)據(jù)的集合
比如有一個(gè)數(shù)組a=[1,2,3,4],還有一個(gè)對(duì)象a={0:1,1:2,2:3,3:4},然后你運(yùn)行alert(a[1]),兩種情況下的運(yùn)行結(jié)果是相同的!這就是說,數(shù)據(jù)集合既可以用數(shù)組表示,也可以用對(duì)象表示,那么我到底該用哪一種呢?數(shù)組表示有序數(shù)據(jù)的集合,而對(duì)象表示無序數(shù)據(jù)的集合。如果數(shù)據(jù)的順序很重要,就用數(shù)組,否則就用對(duì)象。
當(dāng)然,數(shù)組和對(duì)象的另一個(gè)區(qū)別是,數(shù)組中的數(shù)據(jù)沒有“名稱”(name),對(duì)象中的數(shù)據(jù)有“名稱”(name)。但是問題是,很多編程語言中,都有一種叫做“關(guān)聯(lián)數(shù)組”(associative array)的東西。這種數(shù)組中的數(shù)據(jù)是有名稱的。
比如在JavaScript中,可以這樣定義一個(gè)對(duì)象:var a={"城市":"北京","面積":16800,"人口":1600};
但是,也可以定義成一個(gè)關(guān)聯(lián)數(shù)組:
a["城市"]="北京";
a["面積"]=16800;
a["人口"]=1600;
在Javascript語言中,關(guān)聯(lián)數(shù)組就是對(duì)象,對(duì)象就是關(guān)聯(lián)數(shù)組。這一點(diǎn)與PHP語言完全不同,在php中,關(guān)聯(lián)數(shù)組也是數(shù)組。
比如運(yùn)行下面這段javascript:
var a=[1,2,3,4];
a['foo']='Hello World';
alert(a.length);
最后的結(jié)果是4,也就是說,數(shù)組a的元素個(gè)數(shù)是4個(gè)。
但是,運(yùn)行同樣內(nèi)容的php代碼就不一樣了:
$a=array(1,2,3,4);
$a["foo"]="Hello world";
echo count($a);
最后的結(jié)果是5,也就是說,數(shù)組a的元素個(gè)數(shù)是5個(gè)。
所以在處理數(shù)據(jù)給前端的時(shí)候,多數(shù)情況會(huì)出現(xiàn)數(shù)組跟對(duì)象的集合體,如果前端對(duì)數(shù)據(jù)有要求,就得進(jìn)行相應(yīng)的修改。
總結(jié):如果我們就是準(zhǔn)備存儲(chǔ)可以說明性的鍵值對(duì)數(shù)據(jù),json轉(zhuǎn)換之后就是對(duì)象形式,但如果我們只是單存想存儲(chǔ)數(shù)組形式字符串,這要注意索引的順序是否連續(xù),因?yàn)閖son之后為了保持?jǐn)?shù)據(jù)的狀態(tài),他會(huì)給你數(shù)組轉(zhuǎn)換為json對(duì)象形式存儲(chǔ)。對(duì)象名稱是你的數(shù)組鍵,但是連續(xù)的索引的時(shí)候,無需保持這種狀態(tài),則JSON轉(zhuǎn)換之后為數(shù)組字符串。這一點(diǎn)需要注意,你最終想轉(zhuǎn)換為什么形式的JSON字符串好一致性處理。
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號(hào)
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)