PHP多维数组重构:合并子集列值为逗号分隔适配tfPDF表格
PHP数组重构适配tfPDF表格格式解决方案
需求说明
需要将嵌套结构的$data数组转换为适配tfPDF打印函数的格式,核心是将每个供应商下的多条子数据按字段合并为逗号分隔的字符串(单条数据时保持原值)。
原始数组结构
$data = [ "file_id" => 1394, "user_id" => 463466, "periode" => 2022, "costs" => 64.45, "values" => [ "457" => [ "1" => [ "data_id" => 1, "supplier_id" => 457, "costs1" => 1000, "costs2" => 100, "group_name" => "7%", ], "140" => [ "data_id" => 140, "supplier_id" => 457, "costs1" => 2000, "costs2" => 50, "group_name" => "19%", ], "197" => [ "data_id" => 197, "supplier_id" => 457, "costs1" => 3000, "costs2" => 300, "group_name" => "special", ], ], "430" => [ "490" => [ "data_id" => 490, "supplier_id" => 430, "costs1" => 500, "costs2" => 30, "group_name" => "new 4", ], "552" => [ "data_id" => 552, "supplier_id" => 430, "costs1" => 7000, "costs2" => 250, "group_name" => "new 5", ], ], "425" => [ "1106" => [ "data_id" => 1106, "supplier_id" => 425, "costs1" => 10, "costs2" => 4, "group_name" => "new 6", ], ], ], ];
实现代码
// 复制原数组,避免修改原始数据(若无需保留原数据可直接操作$data) $formattedData = $data; // 遍历每个供应商的条目 foreach ($formattedData['values'] as $supplierId => &$items) { // 初始化字段收集数组 $mergedFields = [ 'data_id' => [], 'supplier_id' => [], 'costs1' => [], 'costs2' => [], 'group_name' => [] ]; // 收集当前供应商下所有子项的对应字段值 foreach ($items as $item) { $mergedFields['data_id'][] = $item['data_id']; $mergedFields['supplier_id'][] = $item['supplier_id']; $mergedFields['costs1'][] = $item['costs1']; $mergedFields['costs2'][] = $item['costs2']; $mergedFields['group_name'][] = $item['group_name']; } // 将收集到的数组转换为目标格式:多元素转逗号分隔字符串,单元素保留原值 foreach ($mergedFields as $field => $values) { $mergedFields[$field] = count($values) > 1 ? implode(', ', $values) : $values[0]; } // 替换原供应商条目为合并后的结构 $items = $mergedFields; } // 释放引用,避免后续变量污染 unset($items);
代码说明
- 数组复制:先复制原数组,防止直接修改原始业务数据;
- 双层遍历:外层遍历每个供应商,内层遍历该供应商下的所有子数据,按字段收集值;
- 格式转换:对每个字段的收集结果判断,多值则用
implode拼接为逗号分隔字符串,单值则直接保留; - 引用释放:遍历结束后释放引用变量,避免后续代码出现意外问题。
错误代码分析
你之前尝试的array_walk代码存在逻辑错误:
array_walk($data['values'], function (&$val) { $val[] = implode(", ", $val[]); });
$val[]是非法写法,无法正确获取子数组;- 没有按字段维度去收集值,只是盲目合并,无法得到按字段聚合的目标结构。
内容的提问来源于stack exchange,提问作者user23843629
相关产品推荐
相关产品推荐

