防止json_encode对关联数组进行排序

12

我有一个关联数组

Array(
   [289] => Array(
    'name'=> 'One'
   ),
   [292] => Array(
    'name'=> 'One'
   ),
   [290] => Array(
    'name'=> 'One'
   )
)

当我对这个数组使用json_encode后,即使我将其作为JSON对象获取,它的键也会被排序。

有没有办法防止这种行为发生?


似乎是php json_encode返回了正确的顺序,而是浏览器对对象进行了排序。 - rbawaskar
你确定吗?对于我来说,PHP的json_encode会对数组进行排序,而不是浏览器。 - thomasrutter
请查看 http://php.net/manual/zh/json.constants.php 中的 JSON_FORCE_OBJECT - 我有一个以数字 ID 作为键的关联数组,它将其转换为非关联数组。 - Sp4cecat
2个回答

6
没有规定必须按特定顺序排列。 有关问题,请参见此处:如何阻止Chrome和Opera按索引升序排序JSON对象? 备注:我们谈论的是一个PHP函数,但结果基本上是javascript,因此有关不存在标准的说法同样适用。 顺便说一句,我已经使用以下代码进行了测试。PHP本身似乎不会对数组进行排序,火狐浏览器也没有(根据firebug控制台)。
<pre>
<?php
    $array = array();
    $array[289] = array('name'=>'One');
    $array[292] = array('name'=>'One');
    $array[290] = array('name'=>'One');
    print_r($array);
    $string = json_encode($array);
    print_r($string);
?>
</pre>
<script>
    var foo = <?=$string?>;
    console.log(foo);
</script>

2
这是正确的答案。如果你想要自己的顺序,给数组一个自己的索引。 - Christian
+1,为正确的事情。 - Shankar Narayana Damodaran
1
是的,罪魁祸首就是浏览器。 - rbawaskar
2
注意:如果键是数字并且小于500,则Firefox将对键进行排序。Javascript对象不能保证有序,这是许多人犯的错误,大多数语言的关联数组都不是按输入顺序排序的。如果您想要顺序,请使用有序数组。https://bugzilla.mozilla.org/show_bug.cgi?id=865760 - Rahly

-4

试试这个:

    $ar = array();
    $ar[1] = array('1'=>'one');
    $ar[2] = array('2'=>'two');
    $ar[3] = array('3'=>'three');
    print_r($ar);
    $str= json_encode($ar);
    print_r($str);

它应该能够工作,至少对我有帮助!


它不是那样工作的,我有一个非关联数组,需要保留键,但按值按字母顺序排序,使用Asort可以正确排序,但当发送到json_encode时,对象再次按键排序。 - DJG22
这正是我遇到的同样问题,我已经到处寻找解决方案,但还没有运气。 - Chaoley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接