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

Col*_*lin 5 javascript php ajax json

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

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

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

cle*_*tus 11

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

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

  • 所有浏览器都用于按年龄顺序实现对象关联数组.Chrome现在是个例外.由于ECMA还表示不需要保留订单,因此最好不要依赖订单.有关讨论,请参阅:http://code.google.com/p/chromium/issues/detail?id = 883:Chrome. (3认同)

awg*_*wgy 5

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

rows.sort(function(a, b) {
    return a.row_id - b.row_id;
}
Run Code Online (Sandbox Code Playgroud)

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

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

for (prop in test) {
    document.write(prop + "<br />");
}
Run Code Online (Sandbox Code Playgroud)

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

one
two
another
Run Code Online (Sandbox Code Playgroud)

此外,您可能希望确保获得所需的JSON编码类型json_encode(),例如对象(使用{}花括号)而不是数组([]大括号).您可能需要通过JSON_FORCE_OBJECTjson_encode()迫使它.

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