PHP中的json_decode是否保证在返回数组时保留元素的排序?

时间:2009-06-18 20:15:12

标签: php json sorting

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

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

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

4 个答案:

答案 0 :(得分:4)

在这种情况下,将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);

答案 1 :(得分:1)

我曾多次使用过json_decode(),结果顺序与PHP客户端应用程序保持完整。但是以Python为例,它并没有保留顺序。

一种可以放心的方法是用多个例子来测试它。

答案 2 :(得分:1)

就个人而言,我从不信任任何系统返回确切的订单,除非该订单是专门定义的。如果你真的需要一个订单,那么使用一个字典又名2dimension数组,并为列表中的每个值分配一个位值(0,1,2,3 ...)。

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

请记住,仅仅因为某些事情以某种方式发生,并不意味着故意这样做。它类似于认为数据库中的行有一个顺序,实际上它们不会使用ORDER BY子句。认为ID 1始终位于SELECT中的ID 2之前是不安全的。

答案 3 :(得分:1)

缺乏明确的陈述我会说,根据定义,不会保留明确的顺序。

我的主要思路是什么顺序,确切地说,这将保留? json_decode函数将javascript对象文字的字符串表示作为其参数,然后返回对象或数组。函数的输入(对象文字作为字符串)没有显式排序,这意味着没有明确的顺序要维护json_decode函数。