array_chunk 不修改原数组,返回二维数组;默认重置子数组键,设 $preserve_keys=true 可保留原始键;空数组或 $size≤0 时行为需注意。

array_chunk 会把原数组切片,但不会改变原数组
调用 array_chunk 后,原数组保持不变,返回的是一个二维数组,每个子数组长度为指定的 $size。如果原数组元素数不能被整除,最后一块就是剩下的部分(可能更短)。
常见错误是以为它会“就地分割”或修改原数组——它不会。你必须接收返回值:
$arr = [1, 2, 3, 4, 5]; $chunks = array_chunk($arr, 2); // ✅ 正确:接收返回值 // $arr 仍是 [1,2,3,4,5] // $chunks 是 [[1,2], [3,4], [5]]
第三个参数 $preserve_keys 很容易被忽略
默认情况下,array_chunk 生成的子数组使用数字索引(从 0 开始),即使原数组是关联的。如果你需要保留原始键名(比如处理带字符串键的配置项),必须显式传入 true:
-
array_chunk($arr, 2)→ 子数组键重置为0,1,2... -
array_chunk($arr, 2, true)→ 子数组内保留原始键(如['name' => 'a', 'age' => 25])
注意:$preserve_keys = true 不影响外层数组的索引(它永远是数字索引),只影响每个子数组内部的键。
立即学习“PHP免费学习笔记(深入)”;
遇到空数组或 $size 会报 Warning
array_chunk 对输入很敏感:
- 若
$size是 0,PHP 报Warning: array_chunk(): Size parameter expected to be greater than 0 - 若
$size是负数或非整数(如2.5),会被强制转为整数(2或0),可能触发同上警告 - 若输入不是数组(如
null或字符串),返回空数组[],不报错但结果不符合预期
建议在调用前做简单校验:
if (!is_array($data) || $size < 1) {
return [];
}
$chunks = array_chunk($data, (int)$size);
和 foreach 配合分批处理数据库写入时要注意内存
这是 array_chunk 最典型的实用场景:把大批量数据拆成小批次插入/更新,避免超时或内存溢出。但别直接 chunk 一个几万条的 mysqli_fetch_all() 结果——那已经全加载进内存了。
更合理的做法是:
- 用游标式分页(
LIMIT + OFFSET或WHERE id > ?)边查边 chunk - 或先查 ID 列表,再用
array_chunk拆 ID,最后用IN批量查详情
直接 array_chunk(large_array, 100) 能工作,但没解决根本的内存压力问题。



















