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

PHP中将嵌套JSON数组转CSV时Clubs字段显示Array如何解决

嵌套JSON结构转CSV的解决方案

问题原因

  • fputcsv只能处理字符串、数值等标量类型,遇到数组类字段会直接输出Array文本
  • 原有注释内的代码逻辑错误:单独输出俱乐部信息会导致其与所属游泳选手的信息拆分到不同行,字段无法对应
  • 补充:原有代码json_decode没有传第二个参数true,默认返回对象而非关联数组,直接用$payload['swimmers']做数组访问会抛出致命错误

推荐实现方案(每个俱乐部单独占行,选手基础信息重复,适配1对多的俱乐部关联关系)

$csvFileName = 'converted.csv';
$json = 'myjson.json'; 
$data = file_get_contents($json); 
// 第二个参数设为true,返回关联数组避免访问报错
$payload= json_decode($data, true); 
$file_pointer = fopen($csvFileName, 'w');

if ($file_pointer){
    // 生成CSV表头
    $baseColumns = array_keys($payload['swimmers'][0]);
    // 移除原Clubs字段,后续替换为拆分后的俱乐部字段
    $clubColumnIndex = array_search('Clubs', $baseColumns);
    array_splice($baseColumns, $clubColumnIndex, 1);
    // 追加俱乐部字段,加前缀避免和选手侧的Code字段重名
    $clubColumns = ['Club_name', 'Club_code', 'Club_id'];
    $header = array_merge($baseColumns, $clubColumns);
    fputcsv($file_pointer, $header);

    // 遍历每个游泳选手记录
    foreach($payload['swimmers'] as $row) {
        $clubs = $row['Clubs'] ?? [];
        unset($row['Clubs']);
        $baseRow = array_values($row);

        if (empty($clubs)) {
            // 无俱乐部的情况补空值
            fputcsv($file_pointer, array_merge($baseRow, ['', '', '']));
        } else {
            // 每个俱乐部生成一条完整记录,重复选手基础信息
            foreach($clubs as $c) {
                $clubRow = [
                    $c['Clubname'] ?? '',
                    $c['Code'] ?? '',
                    $c['Clubid'] ?? ''
                ];
                fputcsv($file_pointer, array_merge($baseRow, $clubRow));
            }
        }
    }
    fclose($file_pointer);
}

可选方案(所有俱乐部信息拼到同一行,每个选手仅占1行)

如果需要每条选手记录仅占一行,可将多个俱乐部的同字段用分隔符拼接,替换上述代码中俱乐部处理的逻辑即可:

if (empty($clubs)) {
    $clubRow = ['', '', ''];
} else {
    $clubNames = $clubCodes = $clubIds = [];
    foreach($clubs as $c) {
        $clubNames[] = $c['Clubname'] ?? '';
        $clubCodes[] = $c['Code'] ?? '';
        $clubIds[] = $c['Clubid'] ?? '';
    }
    $clubRow = [
        implode('|', $clubNames),
        implode('|', $clubCodes),
        implode('|', $clubIds)
    ];
}
fputcsv($file_pointer, array_merge($baseRow, $clubRow));

内容的提问来源于stack exchange,提问作者answerSeeker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 07:00:01