Laravel 8:按嵌套列对分组数组进行排序 - 我应该在 sortBy 闭包中放入啥?

Posted

技术标签:

【中文标题】Laravel 8:按嵌套列对分组数组进行排序 - 我应该在 sortBy 闭包中放入啥?【英文标题】:Laravel 8: Sorting grouped array by a nested column - what should I put into sortBy closure?Laravel 8:按嵌套列对分组数组进行排序 - 我应该在 sortBy 闭包中放入什么? 【发布时间】:2021-11-27 10:53:34 【问题描述】:

我在 Laravel 中处理一个特殊形状的数组,其中项目按代表类别名称的键分组。

在下面的示例中,我有来自 1576 类别的元素。每个元素都有一个名为order 的键,它是一个可以为空的整数,应该指示该类别中的顺序。

array:3 [
  "category_1" => array:4 [
    1 => array:2 [
      "option_name" => "Some name 1"
      "option_items" => array:1 [
        0 => array:5 [
          "id" => 1
          "price" => 200
          "time" => 0
          "order" => 999
        ]
      ]
    ]
    2 => array:2 [
      "option_name" => "Some name 2"
      "option_items" => array:1 [
        0 => array:5 [
          "id" => 2
          "price" => 780
          "time" => 5
          "order" => null
        ]
      ]
    ]
    3 => array:2 [
      "option_name" => "Some name 3"
      "option_items" => array:1 [
        0 => array:5 [
          "id" => 3
          "price" => 400
          "time" => 4
          "order" => null
        ]
      ]
    ]
    4 => array:2 [
      "option_name" => "Some name 4"
      "option_items" => array:1 [
        0 => array:5 [
          "id" => 4
          "price" => 300
          "time" => 2
          "order" => 434
        ]
      ]
    ]
  ]
  "category_5" => array:2 [
    6 => array:2 [
      "option_name" => "Some name 5"
      "option_items" => array:1 [
        0 => array:5 [
          "id" => 6
          "price" => 890
          "time" => 3
          "order" => null
        ]
      ]
    ]
    7 => array:2 [
      "option_name" => "Some name 6"
      "option_items" => array:1 [
        0 => array:5 [
          "id" => 7
          "price" => 1290
          "time" => 5
          "order" => null
        ]
      ]
    ]
  ]
  "category_76" => array:2 [
    10 => array:2 [
      "option_name" => "Some name 7"
      "option_items" => array:1 [
        0 => array:5 [
          "id" => 10
          "price" => 320
          "time" => 4
          "order" => 33
        ]
      ]
    ]
    11 => array:2 [
      "option_name" => "Some name 8"
      "option_items" => array:2 [
        0 => array:5 [
          "id" => 11
          "price" => 600
          "time" => 0
          "order" => 500
        ]
        1 => array:5 [
          "id" => 12
          "price" => 2000
          "time" => 9
          "order" => 500
        ]
      ]
    ]
  ]
]

我只是想按顺序键升序(末尾带有空值)对每个类别的整个数组进行排序,因此例如 category_1 中元素的顺序将是

    某个名称 4(434 的顺序) 某个名称 1(999 的顺序) 某个名称 2(订单不存在/空) 某个名字 3(同上)

你尝试了什么?

显然我已经尝试将这个普通的 php 数组转换为集合,并通过以下方式调用 sortBy 并使用闭包:

$sorted = collect($array)->sortBy(function ($elementsInCategory, $key) 
    dd($elementsInCategory); // $key is category_1
)->toArray();

但我只是不知道从回调中返回什么以使其按照我描述的方式排序。

顺便说一句。我不想太复杂,但请注意option_items 子数组有时可能有多个项目(来自category_76 的键11)但这没关系 - 此子数组中的元素将始终具有相同的订单价值。这个内部数组不应该被排序 - 可以保持原样。

【问题讨论】:

【参考方案1】:

您可以为此使用 Laravel 集合宏

$Collection::macro('sortByOrder', function (string $column = 'order', bool $descending = false) /* @var $this 集合 */ return $this->sortBy(function ($order) use ($column) return strtotime(((object)$order)->$column); , SORT_REGULAR, $descending); );

你可以像这样使用它

 $categories->sortByOrder('order',false); 

【讨论】:

以上是关于Laravel 8:按嵌套列对分组数组进行排序 - 我应该在 sortBy 闭包中放入啥?的主要内容,如果未能解决你的问题,请参考以下文章

在C#中按列对二维数组进行排序

如何按嵌套多重集中的值排序?

如何按列对多维数组进行排序?

首先按布尔列对数组进行排序,然后按字符串列排序

如何按列对二维数组(锯齿状)进行排序[重复]

C#按多列对多维数组进行排序