Laravel的array_sort帮助程序DESC e ASC

时间:2014-07-07 14:25:31

标签: php arrays laravel laravel-4

我想使用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)我找不到全面的。

2 个答案:

答案 0 :(得分:4)

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对象中使用分组和排序的组合来获得所需的结果。

  3. 我只是坚持#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]);
}));