将特定项目置于顶部而不对 laravel 集合中的其他项目进行排序
Put specific item on top without sorting others in laravel collection
我有一个有序的 laravel 集合,我也需要将 id = 20 的元素放在最上面,而不对其他元素进行排序。是否可以使用 sortBy?
如果要将特定项目放在数组的顶部,只需单独添加即可。
$type = ['20' => 'Select Type'] + $your_sorted_array ;
示例:
$country = ['1' => 'Andorra'] + Countries::orderby('nicename')->pluck('name', 'id')->toArray();
编辑 1:Given 新信息,您可以“手动”执行此操作的方法是在从集合构建数组后结合使用 unset 和 unshift。
$key_value = $country[20];
unset($country[20]);
array_unshift($country, $key_value );
你可以尝试使用filter
方法
// Say $originalCollection is the response from the large request, with data from the database
$modifiedCollection = $originalCollection->filter(fn($item) => $item->id === 20)
->concat($originalCollection->filter(fn($item) => $item->id !== 20));
或者为了更直观,您可以使用 filter
和 reject
方法
$modifiedCollection = $originalCollection->filter(fn($item) => $item->id === 20)
->concat($originalCollection->reject(fn($item) => $item->id === 20));
$modifiedCollection
将在顶部有 id = 20 的记录,其余记录将保持与 $originalCollection
中相同的顺序
如果您的collection不是非常大,您可以使用keyBy, pull and prepend方法的组合
$originalCollection = Model::hereYourBigQuery()->get()->keyBy('id');
/*
now collection will look like this
{
'id1' => objectWithId1,
'id2' => objectWithId2,
...
20 => objectWithId20,
...
}
*/
// pull takes off element by its key
$toMakeFirst = $originalCollection->pull(20);
// prepend adding item into begining of the collection
// note that prepend will reindex collection so its keys will be set by default
$originalCollection->prepend($toMakeFirst);
更新:
如果你想坚持排序,有一种方法
$collection = Model::yourBigQuery()->get();
$sorted = $collection->sort(function($a, $b){return $a->id == 20 ? -1 : 1;})->values();
如docs method sort
can take closure as argument and utilizes php uasort 幕后所述
我有一个有序的 laravel 集合,我也需要将 id = 20 的元素放在最上面,而不对其他元素进行排序。是否可以使用 sortBy?
如果要将特定项目放在数组的顶部,只需单独添加即可。
$type = ['20' => 'Select Type'] + $your_sorted_array ;
示例:
$country = ['1' => 'Andorra'] + Countries::orderby('nicename')->pluck('name', 'id')->toArray();
编辑 1:Given 新信息,您可以“手动”执行此操作的方法是在从集合构建数组后结合使用 unset 和 unshift。
$key_value = $country[20];
unset($country[20]);
array_unshift($country, $key_value );
你可以尝试使用filter
方法
// Say $originalCollection is the response from the large request, with data from the database
$modifiedCollection = $originalCollection->filter(fn($item) => $item->id === 20)
->concat($originalCollection->filter(fn($item) => $item->id !== 20));
或者为了更直观,您可以使用 filter
和 reject
方法
$modifiedCollection = $originalCollection->filter(fn($item) => $item->id === 20)
->concat($originalCollection->reject(fn($item) => $item->id === 20));
$modifiedCollection
将在顶部有 id = 20 的记录,其余记录将保持与 $originalCollection
如果您的collection不是非常大,您可以使用keyBy, pull and prepend方法的组合
$originalCollection = Model::hereYourBigQuery()->get()->keyBy('id');
/*
now collection will look like this
{
'id1' => objectWithId1,
'id2' => objectWithId2,
...
20 => objectWithId20,
...
}
*/
// pull takes off element by its key
$toMakeFirst = $originalCollection->pull(20);
// prepend adding item into begining of the collection
// note that prepend will reindex collection so its keys will be set by default
$originalCollection->prepend($toMakeFirst);
更新: 如果你想坚持排序,有一种方法
$collection = Model::yourBigQuery()->get();
$sorted = $collection->sort(function($a, $b){return $a->id == 20 ? -1 : 1;})->values();
如docs method sort
can take closure as argument and utilizes php uasort 幕后所述