如何按数组排序Laravel Collection?

文章讲述了在Laravel框架中,如何使用EloquentORM对具有多对多关系的产品集合中的项目进行按特定顺序排序的过程,包括使用`mapWithKeys`和`sortKeys`函数实现定制排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我有一系列产品;每个都有一个包含多个项目的eloquent关系。

以下是我如何检索集合

$collections = Collection::with('items')->get();

这是控制器return $collections的结果。

[
  {
    "id": 1,
    "name": "Product One",
    "items": [
      {
        "id": 1,
        "product_id": 1,
        "name": "Item One",
      },
      {
        "id": 2,
        "product_id": 1,
        "name": "Item Two",
      },
      {
          "id": 3,
          "product_id": 1,
          "name": "Item Three",
      },
  },
  {
      "id": 2,
      "name": "Product Two",
      "items": [
        {
          "id": 1,
          "product_id": 2,
          "name": "Item One",
        },
        {
          "id": 2,
          "product_id": 2,
          "name": "Item Two",
        },
        {
          "id": 3,
          "product_id": 2,
          "name": "Item Three",
        },
    }
]

我想按不同的顺序对每个产品的项目进行排序。

我希望将产品1的项目排序为3, 1, 2,将产品2的项目排序排序为2, 3, 1

$sortOrder = [
  1 => [3, 1, 2],
  2 => [2, 3, 1]
];

$sorted = $products->map(function($product) use ($sortOrder) {
    $order = $sortOrder[$product->id];
    return [ 
        ...$product,
        'items' => $product->items->mapWithKeys(
            fn($item) => [array_search($item['id'], $order) => $item]
        )->sortKeys()
    ];
});

This Outputs

Illuminate\Support\Collection {#4720
  #items: array:2 [
    0 => array:3 [
      "id" => 1
      "name" => "product one"
      "items" => Illuminate\Support\Collection {#4722
        #items: array:3 [
          0 => array:2 [
            "id" => 3
            "name" => "three"
          ]
          1 => array:2 [
            "id" => 1
            "name" => "one"
          ]
          2 => array:2 [
            "id" => 2
            "name" => "two"
          ]
        ]
        #escapeWhenCastingToString: false
      }
    ]
    1 => array:3 [
      "id" => 2
      "name" => "product two"
      "items" => Illuminate\Support\Collection {#4721
        #items: array:3 [
          0 => array:2 [
            "id" => 2
            "name" => "two"
          ]
          1 => array:2 [
            "id" => 3
            "name" => "three"
          ]
          2 => array:2 [
            "id" => 1
            "name" => "one"
          ]
        ]
        #escapeWhenCastingToString: false
      }
    ]
  ]
  #escapeWhenCastingToString: false
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值