如何将subarray json转换为CSV文件?

时间:2016-07-13 14:26:39

标签: php json csv

我想将JSON转换为CSV文件。 这是我的PHP代码:

<?php
$response = '[{
    "field1": "vala1",
    "field2": "vala2",
    "field3": "vala3",
    "field4": [{
        "field4a": "vala4-1",
        "field4b": "vala4-2",
        "field4c": "vala4-3"
    }]
}, {
    "field1": "valb1",
    "field2": "valb2",
    "field3": "valb3",
    "field4": [{
        "field4a": "valb4-1",
        "field4b": "valb4-2",
        "field4c": "valb4-3"
    }]
}]';

$list = json_decode($response, true);
$fp = fopen('test_json.csv', 'w');

foreach ($list as $fields) {
    fputcsv($fp, $fields, ';');
}

fclose($fp); 
?>

但是,我得到了这个通知:

  

数组到字符串转换

在我的CSV文件中,我在第四列中获得数组值。

此处的预期输出:

vala1;vala2;vala3;vala4-1,vala4-2,vala4-3
valb1;valb2;valb3;valb4-1,valb4-2,valb4-3

如果我使用此代码,我可以获得预期值:

    echo $fields['field1'] . ';' . $fields['field2'] . ';' . $fields['field3'] . ';' . $fields['field4'][0]['field4a'] . ',' . $fields['field4'][0]['field4b'] . ',' . $fields['field4'][0]['field4c'] . '<br>';

但它不灵活.. 那么,即使我在JSON文件中添加了很多字段,如何将子数组json转换为CSV文件呢?

提前致谢,

2 个答案:

答案 0 :(得分:1)

编辑:我是一个白痴,并没有思考。正确的答案应如下:

foreach ($list as $fields) {
    $flatFields = [];
    foreach ($fields as $value) {
        $newValue = $value;
        if (isset($value[0]) && is_array($value[0])) {
            $newValue = implode(',', $value[0]);
        }
        $flatFields[] = $newValue;
    }
    fputcsv($fp, $flatFields, ';');
}

Haven尚未测试但应该没问题。但是,如果你的子数组包含子数组,那么你需要一个递归函数来处理它 - 让我知道并且我会更新这个答案。

答案 1 :(得分:0)

试试这个:

...
    $list = json_decode($response, true);
    $fp = fopen('test_json.csv', 'w');

    foreach ($list as $fields) {
        $fields['field4'] = implode(',',$fields['field4']);
        fputcsv($fp, $fields, ';');
    }

    fclose($fp);