【问题标题】:Prevent json_encode associative array sorting [duplicate]防止json_encode关联数组排序[重复]
【发布时间】:2014-02-08 14:00:02
【问题描述】:

我有一个关联数组

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

在我对这个数组使用 json_encode 之后。键已排序,尽管我将其作为 JSON 对象获取。

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

【问题讨论】:

  • 看起来 php json_encode 是返回正确的顺序。它是对对象进行排序的浏览器。
  • 你确定吗?对我来说,PHP 的 json_encode 对数组进行排序,而不是对浏览器进行排序。
  • 查看php.net/manual/en/json.constants.php 中的 JSON_FORCE_OBJECT - 我有一个以数字 ID 作为键的关联数组,它将它们转换为非关联数组

标签: php associative-array json


【解决方案1】:

没有标准规定它必须按特定顺序。

相关问题请参见:How do you stop Chrome and Opera sorting JSON objects by Index ASC?

注意:我们说的是 PHP 函数,但结果基本上是 javascript,因此关于不存在标准的声明也适用。

顺便说一句:我已经使用以下代码对其进行了测试。 PHP 本身似乎没有对数组进行排序,firefox 也没有(根据 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>

【讨论】:

  • 这是正确答案。如果你想要你自己的顺序,给数组你自己的索引。
  • +1 ,为正确的事情。
  • 是的,它的浏览器是罪魁祸首
  • 注意:如果键是数字并且低于 500,firefox 会对键进行排序。Javascript 对象不保证有排序,这是很多人的错误,大多数语言关联数组没有排序通过条目。如果您想要订购,请使用有序数组。 bugzilla.mozilla.org/show_bug.cgi?id=865760
【解决方案2】:

试试这个:

    $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 对象得到再次按键排序
  • 这与我遇到的问题完全相同,一直在到处寻找解决方案,但还没有运气。
猜你喜欢
  • 1970-01-01
  • 2014-05-22
  • 1970-01-01
  • 2015-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多