[英]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_multisort
與SORT_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.