首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何按字符串长度和字母顺序对Laravel集合进行排序?

如何按字符串长度和字母顺序对Laravel集合进行排序?
EN

Stack Overflow用户
提问于 2015-01-03 01:51:19
回答 2查看 6K关注 0票数 0

我正在使用Laravel收藏,这是我目前拥有的。我可以根据imageName或字符串长度进行排序,但我不知道如何同时进行这两个操作。我们会很感激你的帮助!

代码语言:javascript
复制
function sortCards($collection) {
    return $collection->sortBy(function($key) {
        return strlen($key->imageName);
    })
    ->values();
}

我也试过这个:

代码语言:javascript
复制
function sortCards($collection) {
    return $collection->sortBy(function($key) {
        return $key->imageName;
    })
    ->sortBy(function($key) {
        return strlen($key->imageName);
    })
    ->values();
}

当我这样做时,它只根据最后一种排序方法排序,所以它是按字母顺序排列的。

例如,如果图像名称是:

代码语言:javascript
复制
p1, p1a, p2, p2a, p3, p3a, p4, p4a

预期结果将是:

代码语言:javascript
复制
p1, p2, p3, p4, p1a, p2a, p3a, p4a
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-03 09:20:13

@ Shift Exchange是对的,natsort就是这样做的。但是,它只使用数组作为参数。它不可能是一个多级数组。array_multisortSORT_NATURAL标志相结合的效果要好得多。

首先我们需要一份名单。只具有要排序的属性的数组。array_multisort将使用此列表对整个$items数组进行排序。

代码语言:javascript
复制
function sortCards($collection){
    $items = $collection->all();
    $list = $collection->lists('imageName');

    array_multisort($list, SORT_ASC, SORT_NATURAL, $items);

    return new Collection(array_values($items));;
}

编辑

由于PHP的自然排序优先于长度的字母顺序,并且您需要相反的排序,所以您必须使用sort()自己进行排序(在uasort调用下)

代码语言:javascript
复制
function sortCards($collection){
    return $collection->sort(function($a, $b){
        $lengthA = strlen($a->imageName);
        $lengthB = strlen($b->imageName);
        $valueA = $a->imageName;
        $valueB = $b->imageName;

        if($lengthA == $lengthB){
            if($valueA == $valueB) return 0;
            return $valueA > $valueB ? 1 : -1;
        }
        return $lengthA > $lengthB ? 1 : -1;
    });
}
票数 3
EN

Stack Overflow用户

发布于 2015-01-03 02:14:23

你想要的是一种自然的东西。PHP确实提供了此功能。,所以您只需要将它合并到您的函数中即可。

我还没有试过--但类似的东西应该能起作用(或者至少指向正确的方向):

代码语言:javascript
复制
function sortCards($collection) {
    return $collection->sortBy(function($collection) {
        return natsort($collection->imageName);
    })

编辑:这甚至可以:

代码语言:javascript
复制
  function sortCards($collection) {
        return natsort($collection->imageName);
  }
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27750956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档