簡體   English   中英

如何按字符串長度和字母順序對Laravel集合進行排序?

[英]How can I sort a Laravel Collection by both string length and alphabetically?

我正在使用Laravel Collection,這是我目前擁有的。 我可以按imageName或字符串長度進行排序,但無法弄清楚如何同時執行這兩種操作。 一些幫助,將不勝感激!

function sortCards($collection) {
    return $collection->sortBy(function($key) {
        return strlen($key->imageName);
    })
    ->values();
}

我也嘗試過這個:

function sortCards($collection) {
    return $collection->sortBy(function($key) {
        return $key->imageName;
    })
    ->sortBy(function($key) {
        return strlen($key->imageName);
    })
    ->values();
}

當我這樣做時,它僅基於最后一種排序方法進行排序,因此按字母順序未排序。

例如,如果圖像名稱為:

p1, p1a, p2, p2a, p3, p3a, p4, p4a

預期結果將是:

p1, p2, p3, p4, p1a, p2a, p3a, p4a

natsort Exchange是正確的, natsort做到了。 但是,它僅將數組作為參數。 而且它不能是多級數組。 array_multisortSORT_NATURAL標志結合使用效果更好。

首先,我們需要獲取列表。 僅包含您要作為排序依據的屬性的數組。 array_multisort將使用此列表對完整的$items數組進行排序。

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下)

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;
    });
}

您追求的是自然選擇。 PHP確實提供了此功能 ,因此您只需要將其合並到您的函數中即可。

我還沒有嘗試過-但是遵循這些原則的東西應該可以工作(或者至少可以將您指向正確的方向):

function sortCards($collection) {
    return $collection->sortBy(function($collection) {
        return natsort($collection->imageName);
    })

編輯:這甚至可以工作:

  function sortCards($collection) {
        return natsort($collection->imageName);
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM