Laravel的array_sort助手DESC e ASC

问题描述 投票:6回答:2

我想使用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)文档。

php arrays laravel laravel-4
2个回答
5
投票

array_sort()辅助函数是对默认Illuminate\Support\Collection::sortBy()方法的非常薄的包装。不包括评论,这就是它的全部作用:

function array_sort($array, Closure $callback)
{
    return \Illuminate\Support\Collection::make($array)->sortBy($callback)->all();
}

虽然方便,但它的排序功能受到限制。同样,Collection类将允许您更改排序方向,但不能更改太多。

我认为您有两个选择:

  1. 跳过仅Laravel的解决方案,并使用一些常规的PHP和array_multisort()。正如@Jon所评论的,there's some great details in this SO question

  2. 在Collection对象中组合使用分组和排序以实现所需的结果。

我只会坚持使用#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将按闭包的返回值排序。因此,在您的情况下,技巧是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]);
}));
© www.soinside.com 2019 - 2024. All rights reserved.