json_encode($ array)我的php数组的逆序

时间:2012-10-23 16:21:55

标签: php jquery json

我有json_encode($array)它在Google Chrome上以不同的顺序为我提供了一个列表

5 个答案:

答案 0 :(得分:1)

编码由PHP在后端完成,因此Google Chrome与此问题无关。

在编码之前检查数组顺序。

答案 1 :(得分:1)

array_reverse:用于以相反的顺序返回包含元素的数组,例如:

$array = array_reverse($array);
echo json_encode($array,JSON_UNESCAPED_UNICODE);

答案 2 :(得分:0)

使用$array检查var_dump中的值,以确保这是您想要的顺序。

修改:查看manual

中的第3个示例

答案 3 :(得分:0)

您的JSON数据是什么样的?如果:

{1,2,3}

您的浏览器不一定会保留订单。但如果格式化为JSON数组:

[1,2,3]

然后订单将被保留。

答案 4 :(得分:0)

如果数组是关联数组,但由整数索引(如$arr1 = ['3' => 'x', '2' => 'a', '1' => 'b'];),则浏览器(在解析JSON时)假定数组的键指示值的存储顺序(如经典,非关联数组-如$arr2 = ['x','a','b'];)。

自己看看-比较解析从这两个关联数组生成的JSON的结果-一个由非整数字符串(A)索引,另一个由整数索引(即使它们在PHP中是字符串类型的) )(B)。

对于两个示例,PHP中的值均按以下顺序存储:'x', 'a', 'b',并且只有键是不同的。

A)关联数组,由字符串索引

<?php
$arr1 = [
    'foo' => 'x', 
    'bar' => 'a', 
    'baz' => 'b'
];
$json = json_encode($arr1); // $json is now a string: '{"foo":"x","bar":"a","baz":"b"}'

然后,在浏览器中:

var jsonData = JSON.parse('{"foo":"x","bar":"a","baz":"b"}');
console.log(jsonData); 
// prints {foo: "x", bar: "a", baz: "b"} -  the keys are in different order then expected!

B)关联数组,由整数索引(即使它们在PHP中是字符串!)

<?php
$arr1 = [
    '3' => 'x', 
    '2' => 'a', 
    '1' => 'b'
];
$json = json_encode($arr1); // $json is now a string: '"{"3":"x","2":"a","1":"b"}"'

然后,在浏览器中:

var jsonData = JSON.parse('"{"3":"x","2":"a","1":"b"}"');
console.log(jsonData); 
// prints {1: "b", 2: "a", 3: "x"} -  the keys are in different order then expected!
  

如您所见-JSON解析器假设经典数组   索引是整数。

因此,如果您需要维护顺序,建议您切换到经典数组,并在JSON中添加一个order / key字段(出于排序目的-如果需要):

$arr1 = [
    '3' => 'x', 
    '2' => 'a', 
    '1' => 'b'
];
$json = json_encode(array_values($arr1)); // note the array_values() here - but this way you loose the index keys

另一种方式:

$arr1 = [
    '3' => [ 'key' => '3', 'value' => 'x'], 
    '2' => [ 'key' => '2', 'value' => 'a'],
    '1' => [ 'key' => '1', 'value' => 'b'],
];
$json = json_encode(array_values($arr1)); 
        // this way you have both values and keys, 
        // and the parsed JSON will be in the exact order you want it to be