将特定项目置于顶部而不对 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));

或者为了更直观,您可以使用 filterreject 方法

$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 幕后所述