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
相关产品推荐
相关产品推荐

