将集合分成几个部分

问题描述 投票:0回答:2

我试图将集合分成几个部分,以文档中的示例为例

$collection = collect([1, 2, 3, 4, 5, 6, 7]);

$chunks = $collection->chunk(4);

$chunks->all();

我想要这个

[[1, 2, 3, 4], [5, 6, 7]]

但我明白了

[
  [
    1,
    2,
    3,
    4
  ],
  {
    "4": 5,
    "5": 6,
    "6": 7
  }
]

我得到奇怪的输出数据,尽管文档中一切都很好

php laravel
2个回答
3
投票

这背后的原因似乎是 Laravel 中的

chunk()
函数在后台调用
array_chunk()
,第三个参数设置为 true

如果您不一定需要使用集合并且数组就足够了,那么这似乎可以解决问题:

$arr = [1, 2, 3, 4, 5, 6, 7]; $chunks = array_chunk($arr, 4, false);
上面的代码导致

[[1,2,3,4],[5,6,7]]
    

0
投票

多年来,无数人抱怨 Laravel 的集合方法chunk()

 不遵循与 PHP 原生函数
array_chunk()
相同的行为。

仍然从 Laravel 11 开始,无法将

preserveKeys

 参数设置为 
false

chunkWhile()

 提供相同的默认行为,因此以下不是解决方法 - 您将获得与简单调用 
chunk()
 相同的输出

->chunkWhile(fn($v, $k) => $k % 4)

或者

->chunkWhile(fn($v, $k) => $k % 4, false)


目前,有一些使用 Laravel 方法和一些数学准备的解决方法。

groupBy()

PHPize 演示

var_export( collect([1, 2, 3, 4, 5, 6, 7]) ->groupBy(fn($v, $k) => intdiv($k, 4)) );

split()

PHPize 演示

$coll = collect([1, 2, 3, 4, 5, 6, 7]); var_export( $coll ->split(ceil($coll->count() / 4)) );
或者使用 

split()

,在链接时声明所需的 
$coll
 变量:(
PHPize Demo)

var_export( collect([1, 2, 3, 4, 5, 6, 7]) ->pipe( fn($coll) => $coll->split(ceil($coll->count() / 4)) ) );
    
© www.soinside.com 2019 - 2024. All rights reserved.