我想使用Laravel帮助器array_sort
通过一个或多个键对多维数组进行排序。
array(
array('firstname_1','lastname_1'),
array('firstname_2','lastnmae_2')
)
我想首先按名字排序,然后按姓氏排序。
我也希望以DESC或ASC顺序执行此操作。我怎样才能做到这一点?
互联网上有一些功能可以做到这一点,但我想了解如何使用Laravel助手。 array_sort的文档(http://laravel.com/docs/helpers#arrays)我找不到全面的。
答案 0 :(得分:4)
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。
答案 1 :(得分:4)
作为一个例子,如何使用Laravel的排序帮助器按名字排序,然后按姓氏排序。
首先定义更多示例数据:
$array = array(
array('firstname_1','lastname_1'),
array('firstname_2','lastname_3'),
array('firstname_2','lastname_2'),
array('firstname_3','lastname_3'),
);
在我们的闭包中,我们希望先按名字排序,然后按姓氏排序。 Laravel将根据闭包的返回值进行排序。所以在你的情况下,诀窍是连接两个字符串:
$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]);
}));