У меня есть коллекция Laravel с предметами. Предполагая, что предметы находятся в коллекции в числовом порядке.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Если, например, у меня есть элементы 1-15, выложенные как в представлении, как показано ниже (количество строк может измениться, но количество столбцов всегда останется неизменным):
1 4 7 10 13
2 5 8 11 14
3 6 9 12 15
* думайте о каждой колонке как о различном типе млекопитающих (кошек, собак, птиц и т. д.)
Есть ли способ легко изменить порядок элементов в коллекции, как показано ниже?
1 4 7 10 13 2 5 8 11 14 3 6 9 12 15
Так что в представлении теперь это будет выглядеть так:
1 2 3
4 5 6
7 8 9
10 11 12
13 14 15
* Представление, о котором я говорю, приведено только для иллюстрации. Я требую внесения изменений в Коллекцию только в порядке, указанном выше. Оптимальное заполнение коллекции с самого начала было бы оптимальным ответом, но я не могу придумать, как это сделать.
Я не думаю, что это идеально, но это работает.
Этот код предполагает $collection
это коллекция, которую вы хотите изменить
$arrayCollection = array();
$numberOfColumns = 5; // adjust this value to change number of columns
$numberOfRows = $collection->count() / $numberOfColumns
foreach($collection as $index => $model){
$column = floor($index / $numberOfRows);
$newIndex = (int)($index % $numberOfRows) * $numberOfColumns + $column;
$arrayCollection[$newIndex] = $model;
}
ksort($arrayCollection); // sort collection by key
$collection = new Collection($arrayCollection); // make new collection with reordered models
Почему вы должны изменить порядок коллекции? Похоже, вы хотите что-то вроде этого:
@foreach($collection as $item)
<div class="collection-item">{{ $item->value }}</div>
@endforeach
Затем примените стили CSS, чтобы каждый из collection-item
divs отображают inline, а не как блочные элементы.
Если вы действительно хотите переупорядоченную коллекцию, укажите порядок, который вы хотите при заполнении коллекции:
Model::all()->orderBy('field', 'desc')->get();
Не обсуждая вопрос о том, имеет ли смысл упорядочивать коллекцию или лучше сделать это в своем запросе SQL, это ответ на ваш общий вопрос (при необходимости, с учетом ваших конкретных потребностей):
1 сравнить функцию:
/**
* Sort the array in groups.
*
* @param mixed $previous
* @param mixed $next
* @param integer $groups
* @return bool
*/
function sortInGroups($previous, $next, $groups = 3)
{
// If equal then return 0
if ($previous == $next) return 0;
// Otherwise check the modulus in order to
// group the items. However if modulus is zero,
// then shift group to the very end of final array.
$prev = ($previous%$groups) ?: $groups;
$nxt = ($next%$groups) ?: $groups;
// If moduli are equal then items are
// in the same group so compare the items.
if ($prev == $nxt)
{
return ($previous < $next) ? -1 : 1;
}
// Otherwise compare the moduli in order to group the items.
return ($prev < $nxt) ? -1 : 1;
}
2 отсортируйте коллекцию по любому свойству (например, по идентификатору):
$collection = SomeModel::take(15)->get(); // or Support\Collection
$collection->lists('id'); // [1,2,3,4,... 15]
$collection->sort(function ($prev, $next) {
return sortInGroups($prev->id, $next->id, $cols = 5);
});
$collection->lists('id'); // [1,4,7,10,13,2,5,8,11,14,3,6,9,12,15]
Вы можете заказать вручную по столбцу.
Если это идентификатор 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Тогда вы можете использовать order by FIELD(id, 1, 4, 7, 10, 13, 2, 5, 8, 11, 14, 3, 6, 9, 12, 15);