Элегантное решение для переупорядочивания Коллекции Laravel (или идеально ее заполнить с самого начала)?

У меня есть коллекция 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

* Представление, о котором я говорю, приведено только для иллюстрации. Я требую внесения изменений в Коллекцию только в порядке, указанном выше. Оптимальное заполнение коллекции с самого начала было бы оптимальным ответом, но я не могу придумать, как это сделать.

2

Решение

Я не думаю, что это идеально, но это работает.

Этот код предполагает $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
2

Другие решения

Почему вы должны изменить порядок коллекции? Похоже, вы хотите что-то вроде этого:

@foreach($collection as $item)
<div class="collection-item">{{ $item->value }}</div>
@endforeach

Затем примените стили CSS, чтобы каждый из collection-item divs отображают inline, а не как блочные элементы.

Если вы действительно хотите переупорядоченную коллекцию, укажите порядок, который вы хотите при заполнении коллекции:

Model::all()->orderBy('field', 'desc')->get();
1

Не обсуждая вопрос о том, имеет ли смысл упорядочивать коллекцию или лучше сделать это в своем запросе 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

Вы можете заказать вручную по столбцу.
Если это идентификатор 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);

0
По вопросам рекламы [email protected]