php - 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 经验。该示例使用第一个条目中的键作为标题。问题是,我的数据中的第一个条目不能保证包含所有可能的键。
我觉得这个问题有一个相当简单的解决方案,我就是无法破解它。
非常感谢任何建议!
解决方案
你可以试试这个:
$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);
推荐阅读
- oracle - 如何授予对表的触发器访问权限
- javascript - 从高度嵌套的外部文件中选择 JSON 节点
- angular - 如何从自定义 Angular 库中导入功能模块?
- laravel-mix - 如何从生产中删除 console.log?
- javascript - PHP MySQL查询在实际提交的行之前插入3行(来自w2ui表)
- node.js - Node.js 中的 Mongoose MongoDB - 在本地时区保存日期时间
- java - Graphql 使用 Input 类型搜索数据
- azure - 调用 Azure 函数调用失败并显示“函数主机未运行”
- matlab - 链接到 gfortran 以获取 mex 文件
- spring-cloud - 项目构建错误:org.springframework.cloud:spring-cloud-starter-config:jar 的“dependencies.dependency.version”缺失