如何用PHP嵌套循环将PhpSpreadsheet读取的Excel数据整理为多维数组并转JSON
需求完全可实现:PhpSpreadsheet读取Excel后转指定结构数组并生成JSON
这个需求完全可以实现,PhpSpreadsheet能稳定读取Excel数据,PHP的数组操作可以灵活将原始数据整理为任意指定的多维结构,最终通过json_encode()生成JavaScript可直接解析的JSON格式。
实现步骤及示例代码
假设你已经通过PhpSpreadsheet成功读取到原始Excel数据(比如二维数组形式),以下是核心处理逻辑:
1. 原始读取数据示例
假设PhpSpreadsheet读取的原始数据如下(表头+行数据):
// 示例:PhpSpreadsheet读取到的原始数组 $rawExcelData = $spreadsheet->getActiveSheet()->toArray(null, true, true, true); // 或者手动逐行读取的结果,结构类似: $rawExcelData = [ ['姓名', '年龄', '所属部门', '负责项目'], ['张三', 28, '技术部', 'A系统开发'], ['张三', 28, '技术部', 'B性能优化'], ['李四', 32, '产品部', 'C需求迭代'] ];
2. 整理为指定多维数组结构
假设你期望的目标结构是按用户分组,每个用户下包含多个负责项目:
$targetStructure = [ [ 'name' => '张三', 'age' => 28, 'department' => '技术部', 'projects' => ['A系统开发', 'B性能优化'] ], [ 'name' => '李四', 'age' => 32, 'department' => '产品部', 'projects' => ['C需求迭代'] ] ];
对应的整理代码:
// 提取表头 $headers = array_shift($rawExcelData); $targetArray = []; $userIndexMap = []; foreach ($rawExcelData as $row) { $userName = $row[array_search('姓名', $headers)]; // 检查用户是否已存在,避免重复创建 if (!isset($userIndexMap[$userName])) { $userIndexMap[$userName] = count($targetArray); $targetArray[] = [ 'name' => $userName, 'age' => $row[array_search('年龄', $headers)], 'department' => $row[array_search('所属部门', $headers)], 'projects' => [] ]; } // 添加项目到对应用户的列表中 $targetArray[$userIndexMap[$userName]]['projects'][] = $row[array_search('负责项目', $headers)]; }
3. 转换为JSON格式
使用json_encode()生成兼容JavaScript的JSON,注意启用JSON_UNESCAPED_UNICODE避免中文转义:
$jsonResult = json_encode($targetArray, JSON_UNESCAPED_UNICODE); // 输出给JavaScript使用,比如通过接口返回或直接嵌入页面 echo $jsonResult;
关键说明
- 无论你的目标结构是单层对象数组还是多层嵌套结构,都可以通过PHP的循环、数组赋值、条件判断等操作实现数据映射。
- 如果原始Excel的表头或列位置固定,也可以直接通过索引(如
$row[0])读取数据,比array_search()更高效。 - 若需要处理大量数据,建议逐行读取Excel(而非一次性转成数组),避免内存占用过高。
内容的提问来源于stack exchange,提问作者goodnight sir
相关产品推荐
相关产品推荐

