如何获取json对象内的数组的长度?

时间:2011-07-29 13:21:36

标签: php javascript json

我在php中创建一个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,我该如何解决?

3 个答案:

答案 0 :(得分: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开始时才返回数组。

答案 1 :(得分:1)

您已声明了关联数组,而不是索引数组。所以你不能使用长度。

要从关联数组中获取计数,您需要遍历其键:

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

答案 2 :(得分:0)

你可以做一点功能:

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

var maxSlots = len(myResponse.slots)