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

查找由PHP编码的关联数组的长度,php,javascript,Php,Javascript,我有一个用php创建的多维数组,它被传递回jQuery脚本。我需要遍历这个数组并处理数据 在Firebug中,我可以看到数据位于data.data.items。我尝试使用data.data.items.length查找数组的长度,但结果显示未定义。有趣的是,在我的php部分返回一个包含8个空项的数组之前,它就已经正常工作了。既然已经填充了它(索引是字符串),那么长度就不起作用了。每个项目中都有一个对象。什么打破了这一点?JavaScript中的数组仍然是一个对象。当使用字符串(或非整数的任何内容

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


在Firebug中,我可以看到数据位于data.data.items。我尝试使用data.data.items.length查找数组的长度,但结果显示未定义。有趣的是,在我的php部分返回一个包含8个空项的数组之前,它就已经正常工作了。既然已经填充了它(索引是字符串),那么长度就不起作用了。每个项目中都有一个对象。什么打破了这一点?

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

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

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

var i = 0;
for (var item in data.data.items) {
    i++;
}
它将遍历
data.data.items
的每个属性并对它们进行计数。请注意,如果您(或您包含的任何库)向
对象
原型添加属性,这将不会产生预期的结果。这是相当罕见的,但在中为..使用
时必须注意这一点

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

var i = 0;
for (var item in data.data.items) {
    if(data.data.items.hasOwnProperty(item)) {
        i++;
    }
}
您始终可以使用“foreach”类型的循环。在这种情况下,您不需要知道数组长度是多少,甚至不需要知道它是否是数组,因为您也可以迭代对象属性

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

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

但是,如果你真的需要一个数组,考虑把整型作为数组索引。

我会说,第一个开始的地方是语法不同…PHP中的“数组(…)”和javascript中的“[…]”。在不看任何代码的情况下,我会说你需要做一些转换来获得正确的数组格式。这是非常好的信息,我仍然是一个js noob。甚至在我读到Nagh的回答之前,我就想说,你的for构造消除了知道长度的需要。非常感谢。