【问题标题】:Is json_decode in PHP guaranteed to preserve ordering of elements when returning an array?PHP中的json_decode是否保证在返回数组时保留元素的顺序?
【发布时间】:2010-11-04 03:17:12
【问题描述】:

您可以将布尔值传递给 json_decode 以返回数组而不是对象

json_decode('{"foo", "bar", "baz"}', true);  // array(0 => 'foo', 1 => 'bar', 2 => 'baz')

我的问题是这样的。在解析对象文字时,这是否保证项目的顺序将被保留?我知道 JSON 对象属性没有排序,但 PHP 数组是排序的。我在 PHP 手册中找不到明确解决此问题的任何地方。在谨慎方面犯错可能是值得的,但如果可能的话,我想避免包含某种“索引”子属性。

【问题讨论】:

  • “JSON 对象属性未排序” - 我认为您的意思是由 Javascript 解释时。我认为它们有序的,除非您使用了一个对象作为键(在 Javascript 中;不能在 PHP 中这样做,也不能在 JSON 中表示)。

标签: php json sorting


【解决方案1】:

在这种情况下,将 JSON 传递给 PHP 时使用数组不是更有意义吗?如果 JSON 中没有任何对象键(在 PHP 中成为关联数组键),只需将其作为数组发送。这样您就可以保证它们在 PHP 中的顺序与在 javascript 中的顺序相同。

json_decode('{["foo", "bar", "baz"]}');
json_decode('["foo", "bar", "baz"]'); //I think this would work

如果您需要关联数组(这就是您将第二个参数作为true 传递的原因),您必须想出一些方法来在传递时保持它们的顺序。解码后,您将不得不对结果数组进行一些后处理,以按照您想要的方式对其进行格式化。

$json = '{[ {"key" : "val"}, {"key" : "val"} ]}';
json_decode($json, true);

【讨论】:

  • 我找不到任何排序确认,所以我必须确保自己对它们进行排序。谢谢。
【解决方案2】:

就我个人而言,我从不相信任何系统会返回准确的订单,除非该订单是明确定义的。如果您确实需要订单,请使用字典,即二维数组,并为列表中的每个值分配一个位置值 (0,1,2,3...)。

如果您将此规则应用于所有内容,您将永远不必担心该数组的传递/存储,无论是 XML、JSON 还是数据库。

请记住,仅仅因为某些事情以某种方式起作用,并不意味着它是故意这样做的。这类似于认为数据库中的行有顺序,而实际上它们没有顺序,除非您使用 ORDER BY 子句。在 SELECT 中认为 ID 1 总是在 ID 2 之前是不安全的。

【讨论】:

    【解决方案3】:

    我曾经使用过 json_decode() 几次,并且 PHP 客户端应用程序的结果顺序保持不变。但以 Python 为例,它不会保留顺序。

    让自己放心的一种方法是用多个示例对其进行测试。

    【讨论】:

    • 很好,你测试了,它现在可以工作了,但你永远不知道更新是否会改变这个顺序,比抱歉更安全,如果你需要一个订单,请设置一个订单。
    • 是的,你说的很对,但是他说的是JSON没有key,所以没有太多选择,只能依靠PHP的方式来处理,除非他使用关联数组。
    【解决方案4】:

    没有明确的声明,我想说,根据定义,不会保留任何明确的顺序。

    我的主要想法是,这将保留什么顺序? json_decode 函数将 javascript 对象文字的字符串表示 作为其参数,然后返回对象或数组。函数的输入(作为字符串的对象字面量)没有明确的顺序,这意味着 json_decode 函数没有明确的顺序来维护。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-12
      • 2011-11-05
      • 2010-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多