我有json_encode($array)
它在谷歌浏览器上以不同的顺序给了我一个列表
5 回答
array_reverse:用于返回一个元素以相反顺序排列的数组,例如:
$array = array_reverse($array);
echo json_encode($array,JSON_UNESCAPED_UNICODE);
编码由 PHP 在后端完成,因此 Google Chrome 与此问题无关。
在编码之前检查您的数组顺序。
检查$array
使用中的值var_dump
以确保这是您想要的顺序。
编辑:查看手册中的第三个示例
您的 JSON 数据是什么样的?如果:
{1,2,3}
您的浏览器不一定会保留订单。但如果格式化为 JSON 数组:
[1,2,3]
然后订单将被保留。
如果您的数组是关联的,但由整数索引(如$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