2013-05-07 73 views
4

我正在使用PHP創建一個非常大的多維數組。每個對象都包含名稱,ID,ParentID和Children。兒童是以相同格式的更多對象的數組。多維數組上的json_encode() - 使用字符串鍵

這很重要我將每個對象的ID都命名 - 這有助於我將每個對象放在正確的父對象下。 (在下面的代碼中,我使用101,102等)

但是,我遇到的問題是當我使用json_encode在JSON中返回數組。每個'Children'數組都被打印爲對象,而不是數組 - 如下面的JSON代碼所示。

當我在另一個SO線程here上閱讀時,它們「由於包含字符串鍵而被製成對象」 - 雖然它們是數字,但它們仍然是字符串。

{ 
"101": { 
    "ID": "101", 
    "ParentID": "0", 
    "Name": "Root One" 
    "Children": { 
     "102": { 
      "ID": "102", 
      "ParentID": "101", 
      "Name": "Child One" 
     }, 
     "103": { 
      "ID": "103", 
      "ParentID": "101", 
      "Name": "Child Two", 
      "Children": { 
       "104": { 
        "ID": "104", 
        "ParentID": "103", 
        "Name": "Child Child One" 
       } 
      } 
     }, 

有誰知道如何解決這個問題?

編輯:的JSON應該是這樣的(方括號中是很重要的!):

[ 
{ 
    "ID": "101", 
    "ParentID": "0", 
    "Name": "Root One", 
    "Children": [ 
     { 
      "ID": "102", 
      "ParentID": "101", 
      "Name": "Child One", 
      "Children": [ 
+0

這實際上是因爲指數不是連續的,即存在差距。 – 2013-05-07 13:04:34

+0

此外,你的「孩子」ARE對象(從我的角度來看)而不是數組。很高興,讓OOP在你內部流動。 – 2013-05-07 13:20:56

回答

1

我現在有一個工作的解決方案,速度快,效果很好。

  1. 首先,如問題所寫的SO鏈接;

    在JSON中,數組只有數字鍵,而對象具有字符串 屬性。包含一個數組鍵會迫使整個外部結構成爲必需的對象。

    在JSON中;大括號可容納物體({}),方括號可容納數組([])。

  2. 因此,使用字符串作爲鍵將導致json_encode函數返回對象,而重新設置鍵將確保它創建數組。

  3. 因此,就在我返回我的JSON編碼字符串之前,我運行一個函數來重置所有數組鍵。我在這個SO線程(Reset array keys in multidimensional array)上找到的代碼特別有用!

0

http://php.net/manual/en/function.json-decode.php

設置json_decode的第二個參數爲true,ATLEAST得到ASSOC陣列。

除此之外:javascript無法處理非順序/非連續的數組索引,因此只要id不是順序的,json就沒有其他選擇,然後將其轉換爲「字符串」索引。

+0

感謝您的回答,它將來無疑是有用的,但我在jQuery中使用了返回的JSON! – Patrick 2013-05-07 14:24:36

+0

這幾乎不會改變JavaScript無法處理非順序數組鍵的事實。因此JSON也是如此。因此既不能jQuery。 – 2013-05-07 14:51:09

+1

一個downvote沒有評論1年後,這篇文章..人們想知道爲什麼o.O – 2014-05-20 08:25:23

4

JSON數組沒有明確的索引,它只是一個有序列表。唯一具有命名密鑰的JSON數據結構是一個對象。字面應該使這種相當明顯的:

["foo", "bar", "baz"] 

陣列沒有命名的指數並沒有任何條款添加任何。

PHP將列表和鍵值存儲區域合併爲一個array數據類型。 JSON不會。

+0

關聯數組已命名鍵 – 2013-05-07 13:25:42

+2

@mohammad *** PHP ***有「關聯數組」,*** JSON ***不! JSON的「關聯數組」被稱爲* objects *。 – deceze 2013-05-07 13:26:18

+0

謝謝,我遇到的問題是JSON的結構(請參閱我的上次編輯)。這個問題是由於我的PHP關聯數組中的命名鍵造成的。 – Patrick 2013-05-07 14:23:34

0

這是你的對象:

$parent=new StdClass(); 
$parent->ID=101; 
$parent->ParentID=0; 
$parent->Name='Root One'; 

$child1=new StdClass(); 
$child1->ID=1011; 
$child1->ParentID=$parent->ID; 
$child1->Name='Child One'; 
$parent->Children[]=$child1; 


$child1_1=new StdClass(); 
$child1_1->ID=10111; 
$child1_1->ParentID=$child1->ID; 
$child1_1->Name='Child One One'; 
$child1->Children[]=$child1_1;  

這是你的JSON轉換功能:

echo json_encode($parent,JSON_PRETTY_PRINT); 

,這是你的對象編碼成JSON格式:

{ 
    "ID": 101, 
    "ParentID": 0, 
    "Name": "Root One", 
    "Children": [ 
     { 
      "ID": 1011, 
      "ParentID": 101, 
      "Name": "Child One", 
      "Children": [ 
       { 
        "ID": 10111, 
        "ParentID": 1011, 
        "Name": "Child One One" 
       } 
      ] 
     } 
    ] 
} 

答案遲了,因爲我開始學習之後的PHP。無論如何,有一天,有人可能會覺得它有用。