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 中处理一个特殊形状的数组,其中项目按代表类别名称的键分组。
在下面的示例中,我有来自 1
、5
和 76
类别的元素。每个元素都有一个名为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 闭包中放入啥?的主要内容,如果未能解决你的问题,请参考以下文章