【问题标题】:How to convert subarray json to CSV file?如何将子数组 json 转换为 CSV 文件?
【发布时间】:2016-07-13 14:26:39
【问题描述】:

我想将 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 文件中,我在第四列中得到 Array 值。

这是预期的输出:

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 文件?

提前致谢,

【问题讨论】:

标签: php json csv


【解决方案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, ';');
}

尚未测试,但应该没问题。但是,如果您的子数组也包含子数组,您将需要一个递归函数来处理它 - 请告诉我,我会更新这个答案。

【讨论】:

  • 感谢 Sworrub 的回复,但我收到此错误:fputcsv() expects parameter 2 to be array
  • 再次感谢,但我收到此错误:Parse error: syntax error, unexpected '$value' (T_VARIABLE) 。非常抱歉...谢谢:)
  • 哎呀,错过了一个逗号,应该是$newValue = implode(',', $value); 这次我会在进行编辑之前运行代码,以确保我没有错过任何其他内容:P
  • 我也错过了其他东西,没有意识到您的子数组本身就是 JSON 对象,所以我不得不使用 $value[0] 来获取这些对象。检查编辑,我现在已经运行它并且它可以工作。
【解决方案2】:

试试这个:

...
    $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); 

【讨论】:

  • 这仅在子数组始终在 field4 中时才有效,我猜这并非总是如此。此外,由于他的 JSON 的结构,它应该是 $fields['field4'][0] - 我在回答中也犯了这个错误。
猜你喜欢
  • 2019-12-01
  • 2017-09-07
  • 2020-06-08
  • 2019-02-23
  • 1970-01-01
  • 2015-09-12
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
相关资源
最近更新 更多