【问题标题】:Laravel's array_sort helper DESC e ASCLaravel 的 array_sort 助手 DESC e ASC
【发布时间】:2014-08-28 01:47:02
【问题描述】:

我想使用 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) 的文档我觉得不全面。

【问题讨论】:

  • krsort()?请记住,laravel 只是 PHP...
  • 我不会投票结束这个问题,因为我的投票是决定性的,但是有代码(与 Laravel 无关)可以在我的答案之一 here 中完全按照您的意愿行事。如果您认为它完全解决了您的问题,请说出来,然后我们可以关闭它。
  • @Jon,我看到了,感谢您非常详细的帖子。我在这个问题中专门询问 Laravel 助手,因为我想了解如何使用它。我会在我的问题中更加强调这一点。
  • @almo:好的。不幸的是,我几乎可以肯定答案是“Laravel 助手根本不允许这样做”。
  • 该助手只允许您按单列排序。您需要的是array_multisort(),但如果您正在检索这些数据,更好的方法是在您的查询中对其进行排序。

标签: php arrays laravel laravel-4


【解决方案1】:

array_sort() 辅助函数是默认 Illuminate\Support\Collection::sortBy() 方法的一个非常薄的包装器。不包括 cmets,这就是它所做的一切:

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。

【讨论】:

  • 我正在将一个站点从 laravel 4.2 更新到 6.5,这真的很有帮助!我在“Illuminate”前面添加了正斜杠,因为我最初遇到了一个错误。此代码在 laravel 环境中测试。
【解决方案2】:

举个例子,如何使用 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',
);

这将产生一个数组,该数组按名字排序,而不是按姓氏按升序顺序排序。

要使用 descending 顺序,您需要先对数组进行排序,然后再将其反转:

$array = array_reverse(array_sort($array, function($value) {
    return sprintf('%s,%s', $value[0], $value[1]);
}));

【讨论】:

    猜你喜欢
    • 2011-01-15
    • 2015-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    • 2018-05-26
    • 2011-07-01
    • 2020-02-19
    相关资源
    最近更新 更多