我试图将集合分成几个部分,以文档中的示例为例
$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
}
]
我得到奇怪的输出数据,尽管文档中一切都很好
这背后的原因似乎是 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]]
多年来,无数人抱怨 Laravel 的集合方法chunk()
不遵循与 PHP 原生函数
array_chunk()
相同的行为。仍然从 Laravel 11 开始,无法将
preserveKeys
参数设置为
false
。
chunkWhile()
提供相同的默认行为,因此以下不是解决方法 - 您将获得与简单调用
chunk()
相同的输出
->chunkWhile(fn($v, $k) => $k % 4)
->chunkWhile(fn($v, $k) => $k % 4, false)
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))
)
);