在php後端和客戶端資料互動的過程中,json資料中有時格式不定,一會兒是陣列,一會兒是物件,弄得客戶端開發人員要崩潰的感覺。
因此,前後端相關人員先對php的json_encode函式原理有必要的了解是最重要的乙個環節。
php中的array是個萬能的資料結構,並不像其它語言根據需要的場景會定義很多約束性的資料型別來描述結構,所以php程式設計師是很難給客戶端人員講清楚返回的是什麼結構的資料的。
也就變成明明是通過php的陣列資料編碼成json的,但輸出值有時是陣列、有時是物件的情況。
<?php
/*如果你想生成乙個json格式的陣列格式(vector)而非物件格式(map/dict)的,那麼資料的下標:
必須是數字索引,
必須從0開始,
必須從小到大依次增加、中間不可以跳躍、順序不可變動.
*///符合陣列
$vector = [12,
23,18];
echo
json_encode
($vector
);//符合陣列
$vector2 = [
0 => 12
,1 => 23
,2 => 18
];echo
json_encode
($vector2
);//不符合陣列,下標有跳躍
$map = [
0 => 12
,1 => 23
,2 => 18
,4 => 20
];echo
json_encode
($map
);//不符合陣列,下標順序不對
$map = [
0 => 12
,1 => 23
,3 => 18
,2 => 20
];echo
json_encode
($map
);//不符合陣列,下標沒有從0開始
$map_1 = [
1 => '111'
,2 => 'asdfa'
];echo
json_encode
($map_1
);//典型的物件格式
$map_2 = [
'abc' => 1
,'de' => 2
,'fi' => null
];echo
json_encode
($map_2
);/**
* 請注意上面的變數命名,是對應於hack語言中的概念,vector和map為兩種資料集合型別
* 如果你需要將"索引陣列"強制轉化成"物件",可以這樣寫
* json_encode((object) $a);
* 或* json_encode ($a, json_force_object);
**/
解決方案是什麼呢?
就是通過php封裝vector和map/dict這兩種資料結構的類,在構造json輸出結構時,以這兩種型別做封裝和轉換,來確保結構的確定性。
至少,先要建立這樣的型別概念。
PHP JSON陣列與物件的理解
在php後端和客戶端資料互動的過程中,json資料中有時格式不定,一會兒是陣列,一會兒是物件,弄得客戶端開發人員要崩潰的感覺。因此,前後端相關人員先對php的json encode函式原理有必要的了解是最重要的乙個環節。php中的array是個萬能的資料結構,並不像其它語言根據需要的場景會定義很多約...
php json與陣列轉換及中文亂碼問題
php json應用的開始要從php5.2說起。從這個版本一直到現在都增加了對json的支援。主要包含兩個函式 json encode和json decode。json是一種資料的儲存格式,就像php序列化後的字串一樣。它是一種資料描述。比如我們將乙個陣列序列化後存放,就可以很容易的反序列化後應用。...
物件與物件的關係初步理解
類圖中的六種關係 類圖中,類與類之間一般會有六種關係,他們分別是繼承 generalization 實現 implements 組合 composition 聚合 aggressgation 依賴 dependency 關聯 association 繼承 generalization 在這裡teac...