首页 > 解决方案 > PHP:将具有不同键的 JSON 对象转换为 CSV

问题描述

我正在尝试将具有重叠键的 JSON 对象转换为 CSV。

JSON 结构如下所示:

[
 {"key2": "value2", "key3": "value3"},
 {"key1": "value1", "key2": "value2", "key3": "value3"},
 {"key3": "value3"}
]

键的顺序始终相同,但每个条目中出现的键可能会有所不同。目标是这样的 CSV:

key1   , key2   , key3
0      , value2 , value3
value1 , value2 , value3
0      , 0      , value3

我曾尝试使用array_replace重写此示例,但没有运气,因为我缺乏 PHP 经验。该示例使用第一个条目中的键作为标题。问题是,我的数据中的第一个条目不能保证包含所有可能的键。

我觉得这个问题有一个相当简单的解决方案,我就是无法破解它。

非常感谢任何建议!

标签: phpjsoncsv

解决方案


你可以试试这个:

$json = '[{"key2":"value2","key3":"value3"},{"key1":"value1","key2":"value2","key3":"value3"},{"key3":"value3"}]';

$array = json_decode($json, true);

// Gets a list of all the 2nd-level keys in the array
function getAllUniqueKeys($array)
{
    $result = [];
    foreach ($array as $sub) {
        $result = array_merge($result, array_keys($sub));
    }
    return array_unique($result);
}

$uniqueKeys = getAllUniqueKeys($array);
//$uniqueKeys = [
//   "key2",
//   "key3",
//   "key1",
// ];

$csv = [];
$csv[] = $uniqueKeys; //putting unique keys as header

foreach ($array as $sub) {
    $row = [];
    foreach ($uniqueKeys as $uniqueKey) {
        if (array_key_exists($uniqueKey, $sub)) {
            $row[] = $sub[$uniqueKey];
        } else {
            $row[] = 0;
        }
    }
    $csv[] = $row;
}

现在$csv等于:

[
    ["key2", "key3", "key1",],
    ["value2", "value3", 0,],
    ["value2", "value3", "value1",],
    [0, "value3", 0]
];

如果您想对唯一键进行排序,您可以sort($uniqueKeys);在此之后使用它$uniqueKeys = getAllUniqueKeys($array);


推荐阅读