查找由PHP编码的关联数组的长度

时间:2012-08-11 00:39:51

标签: php javascript

我有一个我在php中创建的multidiminsional数组,它被传递回jQuery脚本。我需要遍历这个数组并处理数据。

在Firebug中,我可以看到数据位于data.data.items。我已经尝试使用data.data.items.length查找数组的长度,但它返回未定义。有趣的是,这在我的php部分正常工作之前有效,当它传回8个空项目的数组时。现在它已经填充(并且索引是字符串),长度不起作用。每个项目中还有一个对象。什么打破了这个?

2 个答案:

答案 0 :(得分:1)

尽管如此,JavaScript中的数组仍是一个对象。使用字符串(或任何非整数)设置值时,实际上是在设置对象的属性(实际上,在使用整数键设置时也是如此,但处理方式略有不同)。

对于使用字符串作为键后突然断开的问题,我希望PHP能够实现当你拥有一个诚实的数组而不是一个关联数组,因此它会发送数组(由[]包围)当所有键都是整数时,对象(由{}包围)否则。我相信在字符串键控的情况下,PHP正在生成对象,因此.length变为未定义(而不是在空数组中为0)。

要回答您的问题,可以通过一种简单的方法来计算此数据的“长度”:

var i = 0;
for (var item in data.data.items) {
    i++;
}

将迭代data.data.items的每个属性并计算它们。请注意,如果您(或您包含的任何库)向Object原型添加属性,则不会产生预期结果。这种情况相当罕见,但在使用for..in时必须注意这一点。

您可以使用Nagh建议的方法解决此问题,该方法忽略未在该特定对象上定义的属性:

var i = 0;
for (var item in data.data.items) {
    if(data.data.items.hasOwnProperty(item)) {
        i++;
    }
}

答案 1 :(得分:0)

你总是可以使用“foreach”类循环。在这种情况下,你不需要知道那里有什么数组长度,甚至不知道它是否为数组,因为你可以迭代对象属性。

正如Joe已经指出的那样,javascript没有关联数组,当你尝试使用关联数组时 - 你最终得到了具有属性的对象。但是,如果你确定,只有这个对象获得的属性 - 是你的数组,你可以使用这样的代码:

for (i in arr) {
  if (arr.hasOwnProperty(i)) {
    //do something with arr[i]
  }
}

但是如果你真的需要一个数组,可以考虑使用整数作为数组索引。