2011-07-29 49 views
2

我在PHP中創建一個JSON對象,並將其發送回主頁:如何獲取json對象內的數組的長度?

$invSlots = array(); 
$invSlots['slots'] = array(); 

for($i = 1; $i < $player_max_slots+1; $i++){ //player max slots comes from db 

     $invSlots['slots'][$i] = $inventory_info3[$i]; 

} 

$json = $invSlots; 
$encoded = json_encode($json); 
die ($encoded); 

和後的反應是這樣的:

{"slots": { 
    "1": "1", 
    "2": "0", 
    "3": "0", 
    "4": "4", 
    "5": "0", 
    "6": "0", 
    "7": "3", 
    "8": "0", 
    "9": "0", 
    "10": "0", 
    "11": "2", 
    "12": "0" 
    } 
} 

我試着去得到插槽的數量,如下所示:

var myResponse = JSON.decode('(' + responseText + ')'); //decode server json response 
maxSlots = myResponse.slots.length; //set max slots 

但myResponse.slots.length只是返回undefined,我該如何解決它?

+2

'slots'不是一個數組,它的另一個對象。 –

+2

內部數組從0開始,但是因爲你迫使它從1開始,它會變成一個對象。您將不得不將數組重置爲0,或者使用正確的數字手動向數組添加「長度」鍵。 – Zimzat

回答

1

slots不是一個數組,它是另一個對象。如果它被序列化爲一個數組它可能看起來更像:

{ "slots": 
    [ 
     { "0": "1" }, 
     { "1": "0" }, 
     { "2": "0" }, 
     ... 
    ] 
} 

甚至只是:

{ "slots": [ "1", "0", "0" ] } 

試着改變你的循環中:

for ($i = 0; $i < $player_max_slots; $i++) { //player max slots comes from db 
    $invSlots['slots'][$i] = $inventory_info3[$i]; 
} 

正如Zimzat在說上面的註釋,一旦你的數組索引從0開始,當你將對象序列化爲JSON時,你應該得到一個數組slot

其實,根據php.net論壇上的一些人,你需要知道索引數組。

<?php 
echo json_encode(array("test","test","test")); 
echo json_encode(array(0=>"test",3=>"test",7=>"test")); 
?> 

會給:如果你沒有定義的索引

["test","test","test"] 
{"0":"test","3":"test","7":"test"} 

數組只能返回,或者如果你的索引是連續的,在0

+0

thanaxer這有助於加載! – Thaiscorpion

0

開始你可以做一點函數:

function len(obj) { 
    var ret = 0; 
    for (var i in obj) ret++; 
    return ret; 
} 

var maxSlots = len(myResponse.slots) 
+1

您還需要檢查'if(obj.hasOwnProperty(i))'以防止此函數拾取附加到對象的方法。 – zzzzBov

+0

幾乎沒有重點。如果你創建一個通用的函數來執行一些操作,你應該確保它*工作*。在這種情況下,您不會在JSON中發送對象上的任何函數,但很可能在收到對象後添加這些函數。 – zzzzBov

+0

另外,如果有人修改對象原型,如原型庫(可能包括在路上的某個點)。另外,知道'陷阱'是學習語言背後的侷限性和'魔法'的最好方法,最好不要首先對付他們。 – Zimzat

1

你已經聲明瞭一個關聯數組,而不是一個索引數組。所以你不能使用長度。

要想從一個關聯數組的數量,則需要通過其鍵遍歷:

var count=0; 
for (var key in $invSlots['slots']) 
    count++;