Php 无法返回具有保留键的Laravel中的排序数组
我有以下资料:Php 无法返回具有保留键的Laravel中的排序数组,php,laravel,laravel-5.8,laravel-collection,Php,Laravel,Laravel 5.8,Laravel Collection,我有以下资料: $arr[123]['price'] = 100; $arr[456]['price'] = 500; $arr[100]['price'] = 1000; $arr[511]['price'] = 200; 现在我想按价格排序,所以我做了以下操作: $arr = collect($arr); $sorted = $arr->sortBy('price'); 数组得到排序&dd($sorted)给出以下结果: Collection {#957 ▼ #items:
$arr[123]['price'] = 100;
$arr[456]['price'] = 500;
$arr[100]['price'] = 1000;
$arr[511]['price'] = 200;
现在我想按价格排序,所以我做了以下操作:
$arr = collect($arr);
$sorted = $arr->sortBy('price');
数组得到排序&dd($sorted)给出以下结果:
Collection {#957 ▼
#items: array:4 [▼
123 => array:1 [▼
"price" => 100
]
511 => array:1 [▼
"price" => 200
]
456 => array:1 [▼
"price" => 500
]
100 => array:1 [▼
"price" => 1000
]
]
}
但当我返回排序数组上方时,它会再次按键排序:
return $sorted;
上述产出:
{
"100": {
"price": 1000
},
"123": {
"price": 100
},
"456": {
"price": 500
},
"511": {
"price": 200
}
}
我知道values()可以解决这个问题,但我不想重新编制索引。我只需要以下格式的返回数组:
{
"123": {
"price": 100
},
"511": {
"price": 200
},
"456": {
"price": 500
},
"100": {
"price": 1000
}
}
有人知道我怎么得到这个吗?我还尝试了$preserveKeys标志,但没有成功
我正在使用Laravel 5.8.35进行PHP
PHP中的数组实际上是一个有序映射
因此,收集结果是有序的
但是,我认为您的响应是JSON对象
对象是类型对象的成员。它是一个无序的属性集合,每个属性都包含一个基本值、对象或函数。存储在对象属性中的函数称为方法
如果你需要索引和顺序,也许你可以这样构造结构:
[
{
"index": "123",
"price": 100
},
{
"index": "511",
"price": 200
},
{
"index": "456",
"price": 500
},
{
"index": "100",
"price": 1000
}
]
这是一个有序数组,每个元素都是对象。您可以使用
return $sorted->values()->all();
如官方文件所述
返回$sorted变量时,为什么顺序会发生变化?请在返回$sorted变量之前检查,您可能正在为$sorted变量重新分配另一个或同一个数组。无法复制。使用浏览器的DevTools网络选项卡查看响应负载,它按您想要的方式排序,但很可能是您的浏览器或负责显示JSON的某个插件将其重新排序。@kerbholz谢谢。JSON浏览器chrome扩展对其进行了重新排序。顺序似乎保持不变@vivek_23您可以在postman中尝试,它将返回无序的JSON对象。为了保险起见,我建议使用带有object.的数组,并且您发布的链接是php,
json\u encode()
返回字符串。我所说的是javascript到浏览器。在Postman中,我得到了正确的响应。另外,当javascript在浏览器中接收到此消息时,它将是一个JSON字符串而不是JSON对象,除非使用JSON.parse()显式解析,因为通过网络发送的所有内容都是一个字符串,可以是序列化的,也可以是非序列化的。