2010-04-22 33 views
5

在PHP中,我正在运行一个具有ORDER BY子句的mysql_query。然后我遍历结果来构建一个以row_id为关键字的关联数组。我的关联数组的顺序会从PHP维持到Javascript吗?

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

此页面使用AJAX加载,并在Javascript变量中定义。当我遍历该Javascript变量时,我是否仍然有从mysql_query返回的订单?

回答

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的评论,它在这方面铬的问题跟踪器链接到的问题。不用多说,一个对象的属性的顺序是而不是可靠。
+0

在Opera和Chrome上已经失败,并且随着JS引擎不断优化,其他行为可能会发生变化。不要依赖对象顺序:去数组。 – bobince 2010-04-22 09:35:15

+0

它似乎适用于我在Chrome(5.0.375.9在Mac OS X) - 你使用不同的版本,或者你有一段代码,可能导致Chrome无视命令?我只是从好奇心的角度来感兴趣。我同意你的看法 - 如果需要,最好的方法是使用数组和'.sort()'。 – awgy 2010-04-22 12:32:13

+0

没关系 - 忽略pcorcoran的下面的评论,链接到Chromium问题跟踪器。 – awgy 2010-04-22 12:54:01

11

PHP数组在维护广告订单的属性上有点独特。 Javascript本身没有关联数组。它有对象,通常用作关联数组。这些不保证任何特定的按键顺序。

为什么不将它们输出为数组?这将有一个特定的顺序。如果你想要某种键盘查找,为什么命令很重要?

+1

我想最后我检查了一下,ecma spec说它是无序的,但是所有的浏览器都按照它们的顺序实现了它们。 – goat 2010-04-22 02:49:40

+3

用于按年龄排序实现对象关联数组的所有浏览器。 Chrome现在是例外。而且由于ECMA也表示无需保留订单,所以最好不要依赖订单。 请参阅:http://code.google.com/p/chromium/issues/detail?id = 883讨论re:Chrome。 – pcorcoran 2010-04-22 06:14:09