Php 重新排列Laravel系列(或从一开始就完美填充)的优雅解决方案?

Php 重新排列Laravel系列(或从一开始就完美填充)的优雅解决方案?,php,laravel,collections,Php,Laravel,Collections,我有一个拉威尔收藏,里面有很多东西。假设项目以数字顺序在集合中 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
例如,如果视图中的项目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
@foreach($collection as $item)
    <div class="collection-item">{{ $item->value }}</div>
@endforeach

*我所说的观点只是为了说明目的。我只要求以上述方式更改集合。从一开始就完美地填充集合将是最佳答案,但我想不出一种方法。为什么要对集合重新排序?听起来你想要这样的东西:

1   2   3
4   5   6
7   8   9
10  11  12
13  14  15
@foreach($collection as $item)
    <div class="collection-item">{{ $item->value }}</div>
@endforeach

您可以按列手动排序。 如果这些是id 123456789101121314 15
然后您可以按字段ID使用顺序,1、4、7、10、13、2、5、8、11、14、3、6、9、12、15

我不认为它是完美的,但它是有效的

此代码假定$collection是要重新排序的集合


虽然没有讨论在SQL查询中对集合进行排序是否有意义或更好,但这是您的一般问题的答案,如果需要,请根据您的特定需求进行调整:

1比较功能:



您能在问题中添加视图代码吗?视图代码是不相关的。我只是想知道如何更改集合。视图代码是相关的,对集合重新排序可能不是解决此问题的方法。不,我说查看,但我只需要更改集合,这只是为了说明。从数据库检索集合时是否应用ORDER BY子句?这并不能回答我要问的问题。相反,它可以,但前提是您愿意修改视图代码。在Laravel中,对已经填满的集合进行重新排序是毫无意义的。我的观点和未来一样好。从一开始就完美地填充收藏是最好的,但我看不到这样做的方法。将每一列视为不同类型的哺乳动物。我将如何以我所需要的特定方式填充集合?我的观点与听起来非常接近的观点一样好,我的观点与这个问题无关。我问你是否有更好的建议来填充集合本身,但你没有答案。可以有更多或更少的行。它不是一成不变的。如果元素的数量是固定的,则根据行生成顺序。元素的数量是可变长度的。那么您有两种方式,在视图中对其进行排序或grub整个结果生成顺序字符串,然后用所需的顺序从数据库中再次对其进行grub如果我没有弄错的话,OP不想按id,而是按集合中的索引对其进行重新排序。@lukasgeiter好吧,问题远非具体,所以我们只能猜测。但是,按键排序集合似乎没有意义,除非它基本上是id,而是按项的某些属性,是雄辩\集合。上面提到的是以id为例的通用解决方案,但是它可以进行调整以满足几乎所有的需求。实际上,我也想测试一下这个答案。我很好奇哪个更快。你能做些调整以便按索引重新排序吗?@JarekTkaczyk这对不规则的ID(如45,53,60,61,62,67…)仍然有效吗?@lukasgeiter当然,根据OP的说明:行可能会改变,列数保持不变。它使用模,所以值是否是连续的并不重要。
/**
 * 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;
}
$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]