【问题标题】:Will the Order of my Associative Array be maintained from PHP to Javascript?我的关联数组的顺序会从 PHP 维护到 Javascript 吗?
【发布时间】:2011-02-10 20:54:50
【问题描述】:

在 PHP 中,我正在运行具有 ORDER BY 子句的 mysql_query。然后,我将遍历结果以构建一个关联数组,其中 row_id 作为键。

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

此页面使用 AJAX 加载,并在 Javascript 变量中定义。当我遍历那个 Javascript 变量时,我还会有从 mysql_query 返回的顺序吗?

【问题讨论】:

    标签: php javascript ajax json


    【解决方案1】:

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

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

    【讨论】:

    • 我想我上次检查过,ecma 规范说它是无序的,但所有浏览器都将它们实现为有序。
    • 所有用于将对象关联数组实现为按年龄排序的浏览器。 Chrome 现在是个例外。而且由于 ECMA 还说不需要保留顺序,所以最好不要依赖顺序。请参阅:code.google.com/p/chromium/issues/detail?id=883 讨论重新:Chrome。
    【解决方案2】:

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

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

    虽然它看起来很有效,但不能指望对象中属性的顺序。有关更多信息,请参阅下面的许多 cmets(比我的眼睛更聪明)。然而,这是我在自己有限的测试中用来测试行为的代码:

    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 的问题跟踪器中的问题有关。可以说,对象属性的顺序是可靠的。

    【讨论】:

    • 在 Opera 和 Chrome 上已经失败,并且随着 JS 引擎的不断优化,其他地方的行为可能会发生变化。不要依赖对象顺序:选择数组。
    • 它在 Chrome 中似乎对我有用(Mac OS X 上为 5.0.375.9)——您使用的是不同版本,还是您有可能导致 Chrome 忽略的 sn-p 代码命令?从好奇心的角度来看,我最感兴趣。我同意你的看法——最好的方法是使用数组和.sort()(如果需要)。
    • 没关系——忽略了 pcorcoran 下面的评论,链接到 Chromium 问题跟踪器。
    猜你喜欢
    • 2014-03-03
    • 1970-01-01
    • 2011-08-13
    • 2020-06-09
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多