You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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);

关键修改点说明

  1. 修复JSON解码参数错误:原代码中$decoded = json_decode($data, true);的$data应该是$query(API返回的原始响应数据),否则会导致$decoded为null,完全无法处理数据。
  2. 替换数组扁平化逻辑:移除了会拆分多值数组的array_flatten,改用array_map结合匿名函数,将数组类型的字段直接转为逗号分隔的字符串,确保数组内容存入单个CSV单元格。
  3. 增加错误调试:加入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 12:03:07