我想使用Laravel帮助器array_sort
通过一个或多个键对多维数组进行排序。
array(
array('firstname_1','lastname_1'),
array('firstname_2','lastnmae_2')
)
我想先按姓氏排序,然后按姓氏排序。
我也想按DESC或ASC顺序执行此操作。我该如何实现?
Internet上有一些适合的功能可以做到这一点,但是我想了解如何使用Laravel帮助器。我找不到完整的array_sort(http://laravel.com/docs/helpers#arrays)文档。
array_sort()
辅助函数是对默认Illuminate\Support\Collection::sortBy()
方法的非常薄的包装。不包括评论,这就是它的全部作用:
function array_sort($array, Closure $callback)
{
return \Illuminate\Support\Collection::make($array)->sortBy($callback)->all();
}
虽然方便,但它的排序功能受到限制。同样,Collection类将允许您更改排序方向,但不能更改太多。
我认为您有两个选择:
跳过仅Laravel的解决方案,并使用一些常规的PHP和array_multisort()
。正如@Jon所评论的,there's some great details in this SO question。
在Collection对象中组合使用分组和排序以实现所需的结果。
我只会坚持使用#1。
仅作为示例,如何使用Laravel的排序助手按名字排序,然后按姓氏排序。
首先定义更多示例数据:
$array = array(
array('firstname_1','lastname_1'),
array('firstname_2','lastname_3'),
array('firstname_2','lastname_2'),
array('firstname_3','lastname_3'),
);
在闭合中,我们要先按名字排序,然后再按姓氏排序。 Laravel将按闭包的返回值排序。因此,在您的情况下,技巧是concatenate两个字符串:
$array = array_sort($array, function($value) {
return sprintf('%s,%s', $value[0], $value[1]);
});
内部Laravel现在将对该中间数组的内容进行排序:
$intermediateArray = array(
'firstname_1,lastname_1',
'firstname_2,lastname_3',
'firstname_2,lastname_2',
'firstname_3,lastname_3',
);
这将导致一个数组,该数组按名字和姓氏(以升序的顺序排序)。
要使用降序顺序,您需要先对数组排序,然后将其反转:
$array = array_reverse(array_sort($array, function($value) {
return sprintf('%s,%s', $value[0], $value[1]);
}));