我的关联数组的顺序是否会从PHP维护到Javascript?

时间:2010-04-22 01:12:59

标签: php javascript ajax json

在PHP中,我正在运行一个带有ORDER BY子句的mysql_query。然后我迭代结果来构建一个关联数组,以row_id为键。

然后,我在该数组上调用json_encode并输出结果。

此页面加载了AJAX,并在Javascript变量中定义。当我遍历那个Javascript变量时,我是否仍然拥有从mysql_query返回的顺序?

2 个答案:

答案 0 :(得分:11)

PHP数组在维护插入顺序的属性方面有些独特。 Javascript本身没有关联数组。它有对象,通常用作关联数组。这些不保证任何特定的密钥订单。

为什么不将它们作为数组输出?这将有一个特定的顺序。如果您想要某种密钥查找,为什么订单很重要?

答案 1 :(得分:5)

cletus说的是正确的,但根据我的经验,大多数浏览器都会维护订单。话虽这么说,你应该考虑使用Array。如果您需要在客户端收到它后对其进行排序,只需在JavaScript中使用.sort()函数:

rows.sort(function(a, b) {
    return a.row_id - b.row_id;
}

虽然它似乎有效但是对象中的属性顺序不能计算在内。请参阅下面的许多评论以获取更多信息(比我更聪明的眼睛)。但是,这是我用来测试自己有限测试中的行为的代码:

var test = {
    one: 'blah',
    two: 'foo',
    another: 'bar'
};

for (prop in test) {
    document.write(prop + "<br />");
}

打印(在Firefox 3.6.3和Chrome 5.0.375.9中):

one
two
another

此外,您可能希望确保从json_encode()获取需要的JSON编码类型,例如对象(使用{}花括号)而不是数组([]大括号)。您可能需要将JSON_FORCE_OBJECT传递给json_encode()以强制它。

  • 编辑以澄清Array方法是首选的方式)
  • 再次编辑(抱歉),因为我忽略了pcorcoran的评论,该评论与Chromium的问题跟踪器中的问题有关。可以说,对象属性的顺序可靠。