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()显式解析,因为通过网络发送的所有内容都是一个字符串,可以是序列化的,也可以是非序列化的。