如何修改PHP代码将含多个元素的JSON数组扁平化后存入单个CSV单元格
如何修改PHP代码将含多个元素的JSON数组扁平化后存入单个CSV单元格
我来帮你解决这个问题~你的核心问题是原来的array_flatten函数会把嵌套数组的每个元素拆成独立的CSV字段,当遇到多值数组(比如invoice_ids包含多个ID时),就会撑爆CSV的列结构,导致数据错位。我们需要把数组类型的字段转成单个字符串(比如用逗号分隔),而不是拆分成多个字段。
问题根源分析
原代码中的array_flatten通过递归迭代器把嵌套数组的每一个元素都转为独立的数组项,当invoice_ids有多个值时,会在CSV中新增额外的列,彻底破坏表头和数据的对应关系。
修改后的完整代码
下面是修复后的代码,同时修正了原代码中的一个关键bug:
<?php // 假设$x是当前页码,$csv是目标CSV文件路径,$auth_key_here是你的认证密钥 $url = 'https://example.com/?page='.$x; $curl = curl_init($url); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_HEADER, false); curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json', $auth_key_here)); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "GET"); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); $query = curl_exec($curl); curl_close($curl); // 修复原代码bug:将$data改为$query(API返回的原始响应数据) $decoded = json_decode($query, true); // 增加JSON解码错误检查,方便调试 if (json_last_error() !== JSON_ERROR_NONE) { die('JSON解码失败:' . json_last_error_msg()); } $row_count = 0; // 写入表头(仅第一页时执行) if ($x == 1) { $fp = fopen($csv, 'w'); if (!empty($decoded[0])) { // 取第一条数据的键作为CSV表头 fputcsv($fp, array_keys($decoded[0])); } fclose($fp); } // 追加数据到CSV $fp2 = fopen($csv, 'a'); foreach ($decoded as $fields) { // 格式化每个字段:数组类型转成逗号分隔的字符串,非数组直接保留 $formatted_fields = array_map(function($value) { if (is_array($value)) { // 用逗号分隔数组元素,可根据需求替换为其他分隔符(如|) return implode(',', $value); } return $value; }, $fields); fputcsv($fp2, $formatted_fields); $row_count++; } fclose($fp2);
关键修改点说明
- 修复JSON解码参数错误:原代码中
$decoded = json_decode($data, true);的$data应该是$query(API返回的原始响应数据),否则会导致$decoded为null,完全无法处理数据。 - 替换数组扁平化逻辑:移除了会拆分多值数组的
array_flatten,改用array_map结合匿名函数,将数组类型的字段直接转为逗号分隔的字符串,确保数组内容存入单个CSV单元格。 - 增加错误调试:加入
json_last_error检查,方便快速定位API返回的无效JSON问题。
扩展处理:深层嵌套数组
如果你的API返回的JSON有更深层级的嵌套数组,可以使用递归函数来处理:
function format_nested_field($value) { if (is_array($value)) { // 递归处理嵌套数组,拼接所有元素 $nested_values = array_map('format_nested_field', $value); return implode(',', $nested_values); } return $value; }
然后在array_map中使用这个函数即可:
$formatted_fields = array_map('format_nested_field', $fields);
注意事项
- 如果字段内容本身包含逗号(比如某个ID是带逗号的字符串),建议更换分隔符(如
|),同时在fputcsv中指定分隔符参数:fputcsv($fp, $fields, '|');,确保表头和数据使用相同的分隔符。 - 确保API返回的是数组格式的JSON(即
$decoded是二维数组),如果返回的是单个对象,需要调整表头和数据处理逻辑。
内容来源于stack exchange
相关产品推荐
相关产品推荐

