array_chunk()用于将一维数组按固定长度拆分为二维数组,保持顺序、不丢数据,末组不足则保留;要求第二参数为正整数,空数组返回[],字符串键会被重置为数字索引。

用 array_chunk() 拆分一维数组成固定长度的二维数组
最常见需求是把一维索引数组按每 n 个元素一组,转成二维数组。PHP 内置的 array_chunk() 就是干这个的,它不改变原数组顺序,也不会丢数据,最后一组不足 n 个也会保留。
注意点:
-
array_chunk($arr, 3)的第二个参数必须是正整数,传0或负数会报 Warning:“The size argument must be greater than zero” - 如果原数组为空,
array_chunk()返回空数组[],不是[[]] - 它只处理数值键,原数组的字符串键会被重置为数字索引(从 0 开始)
示例:
$list = ['a', 'b', 'c', 'd', 'e']; $result = array_chunk($list, 2); // 得到 [['a','b'], ['c','d'], ['e']]
按字段值动态分组生成多维数组(比如按 user_id 聚合)
这不是“拆分”,而是“归类”——原始一维数组里每个元素是关联数组(如数据库查询结果),你想按某个字段(如 user_id)把它们聚合成以该字段为键的二维结构。这时不能用 array_chunk(),得手动遍历构建。
典型错误写法:foreach 里直接 $group[$row['user_id']] = $row,这只会保留每个 user_id 的最后一条记录。
正确做法是初始化空数组再 push:
$grouped = [];
foreach ($rows as $row) {
$key = $row['user_id'];
if (!isset($grouped[$key])) {
$grouped[$key] = [];
}
$grouped[$key][] = $row;
}
也可以用更简洁的写法(PHP 7+):
$grouped[$row['user_id']][] = $row;
但前提是确保 $grouped 已声明为数组,否则第一次赋值会触发 Notice。
用 array_reduce() 函数式方式实现分组(适合链式处理场景)
如果你在写 pipeline 风格代码,或者想避免显式 foreach,array_reduce() 是个可选方案。它本质还是遍历 + 累积,但语义更聚焦“转换”。不过要注意:它对空数组返回的是初始值(如 []),不是 false 或 null。
示例(按 type 分组):
$grouped = array_reduce($items, function ($carry, $item) {
$key = $item['type'] ?? 'unknown';
$carry[$key][] = $item;
return $carry;
}, []);
陷阱:
- 忘记传第三个参数(初始值)会导致
$carry第一次是null,然后null['xxx']报错 - 如果
$item['type']可能为null或0,用??比?:更安全,避免误判
注意 key 类型和引用问题:别意外覆盖或修改原数组
PHP 数组赋值默认是值拷贝,但如果你在循环中用了 &$item 引用,又在后续操作中修改了 $item,原数组可能被连带改掉——尤其在分组时,你以为在往新数组里 push,实际 push 的是引用。
容易被忽略的细节:
- 用
foreach ($arr as &$item)后,必须加unset($item),否则下一次循环可能残留引用,导致意外覆盖 - 如果原数组元素本身是对象,即使不用
&,$group[$key][] = $item存的也是对象引用,后续修改对象属性会影响所有分组里的同一对象 - 需要深拷贝对象时,得用
clone $item或序列化反序列化
这种隐式引用行为,在调试分组结果“莫名变化”时最难排查。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











