PHP数组分块处理有三种方式:一是用array_chunk()按固定大小切分;二是自定义遍历逻辑实现条件分块;三是用生成器实现内存友好的流式分块,适用于超大数组。

PHP 中实现数组分块处理,最直接的方式是使用内置函数 array_chunk(),它能按指定大小将数组切割为多个子数组。但若需更灵活的控制(如按条件分块、流式处理大数组、避免内存溢出),则需自定义逻辑。
基础分块:用 array_chunk 快速切分
适用于中等规模数组,代码简洁、语义清晰:
- 语法:
array_chunk($array, $size, $preserve_keys = false) - $size 必须为正整数,小于等于原数组长度时,末尾块可能更短
- 设置 $preserve_keys = true 可保留原始键名(仅对关联数组有意义)
示例:
$numbers = [1, 2, 3, 4, 5, 6, 7];$chunks = array_chunk($numbers, 3);
// 结果:[[1,2,3], [4,5,6], [7]]
条件分块:按业务规则动态切分
当不能简单按固定长度切分(例如:把连续相同状态的元素归为一块),需遍历+状态跟踪:
立即学习“PHP免费学习笔记(深入)”;
- 初始化空块和当前块,逐个检查元素是否满足“可合并”条件
- 条件不满足时,将当前块推入结果并重置;循环结束后别忘了追加最后一块
- 适合日志分组、订单状态聚合、时间序列断点识别等场景
示例(按奇偶性分块):
$input = [1, 3, 5, 2, 4, 6, 7, 9];$chunks = [];
$current = [];
foreach ($input as $item) {
if (empty($current) || ($item % 2) === ($current[0] % 2)) {
$current[] = $item;
} else {
$chunks[] = $current;
$current = [$item];
}
}
if (!empty($current)) $chunks[] = $current;
内存友好型分块:处理超大数组
面对数百万元素的数组,一次性加载到内存易触发 OOM。可用生成器(Generator)实现惰性分块:
- 不预先构建整个数组,而是在迭代过程中按需产出每一块
- 配合 yield 和文件/数据库游标,真正实现流式处理
- 适合导入导出、批量更新、ETL 等后台任务
示例(从文件逐行读取并分块):
function fileChunkIterator($filename, $chunkSize = 1000) {$handle = fopen($filename, 'r');
$chunk = [];
while (($line = fgets($handle)) !== false) {
$chunk[] = trim($line);
if (count($chunk) >= $chunkSize) {
yield $chunk;
$chunk = [];
}
}
if (!empty($chunk)) yield $chunk;
fclose($handle);
}
// 使用:
foreach (fileChunkIterator('data.txt', 500) as $batch) {
// 处理每批 500 行
}
扩展技巧:分块后并行处理(需注意环境支持)
PHP 原生不支持多线程,但可通过以下方式提升吞吐:
- CLI 模式下用 pcntl_fork() 派生子进程(Linux/macOS)
- 结合 curl_multi 或 ReactPHP 实现异步 HTTP 批量请求
- 交由消息队列(如 Redis List + Worker)解耦执行,更稳定可靠
注意:Web SAPI(如 Apache/PHP-FPM)中 fork 存在风险,生产环境优先选队列方案。











