
本文介绍如何使用 PHP 高效提取多层嵌套数组中所有 text 字段,并按原始层级结构保留为二维数组,支持两种输出格式:纯值数组或键值对数组。
本文介绍如何使用 php 高效提取多层嵌套数组中所有 `text` 字段,并按原始层级结构保留为二维数组,支持两种输出格式:纯值数组或键值对数组。
在处理 OCR 解析、PDF 表格提取或类似结构化文本数据时,常会遇到深度嵌套的 PHP 数组(如 data[0][0][0]['text']),而业务逻辑往往只需其中的 text 字段,其余坐标、尺寸等元信息需被剥离。目标不是简单“展平”为一维,而是**保留原始行级分组结构(即 $data[0], $data[1], … 各自为一行),仅提取每行内各单元格的 text 值,并可选地以 [text => 'xxx'] 形式封装或直接返回字符串值。
✅ 推荐方案:array_column() + array_map() 组合
核心思路是:对 $array['data'](即最外层的行数组)逐行处理,每行是一个包含多个单元格数组的集合;再对每个单元格数组,提取其 'text' 键值。
以下函数提供灵活、健壮的实现:
function extractTextColumns(array $data, string $field = 'text', bool $wrapAsAssoc = false): array
{
return array_map(function ($row) use ($field, $wrapAsAssoc) {
if (!is_array($row)) {
return [];
}
if ($wrapAsAssoc) {
// 返回 [ ['text' => 'xxx'], ['text' => 'yyy'], ... ]
return array_map(function ($cell) use ($field) {
return [$field => $cell[$field] ?? ''];
}, $row);
} else {
// 返回 [ 'xxx', 'yyy', ... ] —— 纯值数组
return array_column($row, $field);
}
}, $data);
}? 使用示例
假设原始数据存于变量 $raw 中,且目标数据位于 $raw[0]['data']:
立即学习“PHP免费学习笔记(深入)”;
// ✅ 提取为带键的关联子数组(符合提问中最终期望结构) $result = extractTextColumns($raw[0]['data'], 'text', true); print_r($result); // ✅ 提取为简洁纯值二维数组(更常用、更易后续处理) $simpleResult = extractTextColumns($raw[0]['data'], 'text', false); print_r($simpleResult);
⚠️ 注意事项
-
空值安全:使用
$cell[$field] ?? ''防止Undefined index警告,确保缺失text键时返回空字符串; -
类型防护:函数开头校验
$row是否为数组,避免对非数组项调用array_column导致警告; -
性能友好:全程使用内置函数(
array_map、array_column),无递归、无循环嵌套,时间复杂度为 O(n),适用于千级单元格规模; -
扩展性强:
$field参数支持提取任意字段(如'left'、'width'),$wrapAsAssoc控制输出形态,无需修改逻辑即可复用。
? 进阶建议
若需进一步扁平为一维数组(所有 text 合并为单个列表),可在结果上链式调用:
$allTexts = array_merge(...$simpleResult); // PHP 7.4+ 展开语法
// 或兼容旧版:
$allTexts = call_user_func_array('array_merge', $simpleResult);总之,该方案兼顾可读性、健壮性与实用性,是处理此类嵌套文本提取任务的 PHP 最佳实践。



















