2013-08-20 58 views
3

您可以幫我解釋一下這裏發生了什麼。PHP JSON編碼在未設置時將鍵轉爲字符串

$data[0] = array("one" => "uno", "two" => "dos", "three" => "tres"); 
$data[1] = array("one" => "uno", "two" => "dos", "three" => "tres"); 

//unset($data[0]); 

$encode = json_encode($data); 

$decode = json_decode($encode); 

var_dump($decode); 

輸出:

array(2) { [0]=> object(stdClass)#1 (3) { ["one"]=> string(3) "uno" ["two"]=> string(3) "dos" ["three"]=> string(4) "tres" } [1]=> object(stdClass)#2 (3) { ["one"]=> string(3) "uno" ["two"]=> string(3) "dos" ["three"]=> string(4) "tres" } } 

這是正常保持它作爲數組,但只要我取消它把它變成一個obj中的陣列的一部分。

$data[0] = array("one" => "uno", "two" => "dos", "three" => "tres"); 
$data[1] = array("one" => "uno", "two" => "dos", "three" => "tres"); 

unset($data[0]); 

$encode = json_encode($data); 

$decode = json_decode($encode); 

var_dump($decode); 

輸出:

object(stdClass)#1 (1) { ["1"]=> object(stdClass)#2 (3) { ["one"]=> string(3) "uno" ["two"]=> string(3) "dos" ["three"]=> string(4) "tres" } } 

如何保持一致性?

+4

JS是一種愚蠢的,並期望所有陣列都是基於0的連續數字鍵。如果你在任何地方跳過一個鍵(例如'1,2,4,5'),或者開始非零,你會得到一個對象。 –

回答

1

我想看看json_encode的選項。我認爲JSON_FORCE_OBJECT應該強制執行。

+2

我會說'JSON_FORCE_OBJECT'與此處嘗試實現的內容相反。 – hakre

+0

他說他想要一致性,並不是說它必須是一個或另一個。這可能不是最好的選擇,但它確實解決了我相信的問題。 – ars265

+0

第一個索引名稱中的一致性也適用於對象屬性。 'JSON_FORCE_OBJECT'也可以創建*不一致*索引,只需通過屬性而不是鍵。所以它只能解決問題的一半(類型不一致),然後解決完整的問題(類型*和*索引不一致),這也突出了類型不一致只是索引不一致的副作用。但是 - 並未在您的答案中顯示 - 首先解決索引不一致問題會使類型不一致性過時。與http://php.net/json_encode上的示例進行比較 – hakre

0

JavaScript區分數組和對象。 PHP只有數組才能同時覆蓋這兩種類型。

連續數字0開始的PHP數組被編碼爲Javascript數組,任何其他東西都被編碼爲對象。

相關問題