php - 将多维数组的 json 转换为 csv,其中子元素也具有父值
问题描述
我正在尝试将 json 文件解析为 csv,当我遇到具有父元素的多维数组时会出现问题 - 我需要该父数组的每个子元素在 csv 中与父值单独成行。
当我尝试循环遍历子元素并且无法访问父值时,就会出现问题 - 我正在考虑在循环数据之前制作一个连接字符串,然后打印字符串 + 数据 foreach 值,但这似乎是一个 hack。有谁知道解决这个问题的更好方法?
[0]=>
array(7) {
["platform"]=>
string(7) "web"
["date"]=>
string(10) "2019-04-17"
["name"]=>
string(42) "something.com"
["data"]=>
array(10) {
[0]=>
array(2) {
["revenue"]=>
float(0.02)
["countryCode"]=>
string(2) "AU"
}
[1]=>
array(2) {
["revenue"]=>
float(0.03)
["countryCode"]=>
string(2) "BE"
}
[2]=>
array(2) {
["revenue"]=>
float(0.02)
["countryCode"]=>
string(2) "CH"
}
[3]=>
array(2) {
["revenue"]=>
float(0.01)
["countryCode"]=>
string(2) "CZ"
}
[4]=>
array(2) {
["revenue"]=>
float(0.34)
["countryCode"]=>
string(2) "GB"
}
[5]=>
array(2) {
["revenue"]=>
float(0.03)
["countryCode"]=>
string(2) "NL"
}
[6]=>
array(2) {
["revenue"]=>
float(0.01)
["countryCode"]=>
string(2) "NO"
}
[7]=>
array(2) {
["revenue"]=>
float(0.01)
["countryCode"]=>
string(2) "NZ"
}
[8]=>
array(2) {
["revenue"]=>
float(0.03)
["countryCode"]=>
string(2) "SE"
}
[9]=>
array(2) {
["revenue"]=>
float(2.46)
["countryCode"]=>
string(2) "US"
}
}
}
[1]=>
array(7) {
["platform"]=>
string(7) "web"
["date"]=>
string(10) "2019-04-17"
["name"]=>
string(42) "something-else.com"
["data"]=>
array(10) {
[0]=>
array(2) {
["revenue"]=>
float(0.72)
["countryCode"]=>
string(2) "AU"
}
[1]=>
array(2) {
["revenue"]=>
float(12.03)
["countryCode"]=>
string(2) "BE"
}
[2]=>
array(2) {
["revenue"]=>
float(0.27)
["countryCode"]=>
string(2) "CH"
}
[3]=>
array(2) {
["revenue"]=>
float(8.71)
["countryCode"]=>
string(2) "CZ"
}
}
}
我希望将其转换为:
platform,date,name,revenue,countryCode
"web","2019-04-17","something.com",0.02,"AU"
"web","2019-04-17","something.com",0.03,"BE"
"web","2019-04-17","something.com",0.02,"CH"
"web","2019-04-17","something.com",0.01,"CZ"
"web","2019-04-17","something.com",0.34,"GB"
...
设法使这项工作:
$f = fopen('examlple.csv', 'w');
$firstLineKeys = false;
foreach ($array as $line)
{
if (empty($firstLineKeys))
{
$firstLineKeys = array_keys($line);
array_pop($firstLineKeys); //removing data as we will loop over it later, and adding the 2 data keys that will be in the results.
$firstLineKeys[] = "country";
$firstLineKeys[] = "revenue";
fputcsv($f, $firstLineKeys);
$firstLineKeys = array_flip($firstLineKeys);
}
$line_array = array($line);
$string = array();
foreach ($line as $key => $value)
{
if($key !== "data"){
$string[]= $value;
}else{
foreach($value as $country){
$new_string = $string;
$new_string[]=$country['countryCode'];
$new_string[]=$country['revenue'];
fputcsv($f, $new_string);
}
}
array_push($line_array,$value);
}
}
但我想知道是否有更好的方法来做到这一点。
解决方案
我创建了一个如下所示的数组,请检查它是否对您有帮助:
$final = array();
$i = 0;
$f = array();
echo '<pre>';
foreach($arr as $ar) {
$final[$i] = array(
'platform' => $ar['platform'],
'date' => $ar['date'],
'name' => $ar['name'],
);
foreach($ar['data'] as $key => $value) {
$f[] = array_merge($final[$i], $value);
}
$i++;
}
print_r($f);
die;
例子:
$arr = array(
array(
'platform' => 'web',
'date' => 'web',
'name' => 'web',
'data' => array(
array(
'revenue' => '0.02',
'countryCode' => 'AU',
),
array(
'revenue' => '0.02',
'countryCode' => 'AU',
),
array(
'revenue' => '0.02',
'countryCode' => 'AU',
),
array(
'revenue' => '0.02',
'countryCode' => 'AU',
),
)
),
array(
'platform' => 'web1',
'date' => 'web',
'name' => 'web',
'data' => array(
array(
'revenue' => '0.0211',
'countryCode' => 'AU11',
),
array(
'revenue' => '0.02',
'countryCode' => 'AU12',
),
array(
'revenue' => '0.02',
'countryCode' => 'AU13',
),
array(
'revenue' => '0.02',
'countryCode' => 'AU14',
),
)
),
array(
'platform' => 'web2',
'date' => 'web',
'name' => 'web',
'data' => array(
array(
'revenue' => '0.02',
'countryCode' => 'AU21',
),
array(
'revenue' => '0.02',
'countryCode' => 'AU22',
),
array(
'revenue' => '0.02',
'countryCode' => 'AU23',
),
array(
'revenue' => '0.02',
'countryCode' => 'AU24',
),
)
),
array(
'platform' => 'web3',
'date' => 'web',
'name' => 'web',
'data' => array(
array(
'revenue' => '0.02',
'countryCode' => 'AU31',
),
array(
'revenue' => '0.02',
'countryCode' => 'AU32',
),
array(
'revenue' => '0.02',
'countryCode' => 'AU33',
),
array(
'revenue' => '0.02',
'countryCode' => 'AU34',
),
)
)
);
$final = array();
$i = 0;
$f = array();
echo '<pre>';
foreach($arr as $ar) {
$final[$i] = array(
'platform' => $ar['platform'],
'date' => $ar['date'],
'name' => $ar['name'],
);
foreach($ar['data'] as $key => $value) {
$f[] = array_merge($final[$i], $value);
}
$i++;
}
print_r($f);
die;
推荐阅读
- awk - 从另一个文件中删除与特定模式匹配的行
- java - Hibernate / JPA 映射响应 - 子查询
- deep-learning - LSTM 预测限制
- c++ - 加载外部类 c++
- python - 查找具有不同元素的最大元组列表
- python - 从另一个工作表中的另一个单元格为单元格赋值 - Pandas/Openpyxl/Python
- django - 如何全局告诉 Cloudinary 自动决定 Django 中的文件类型?
- reactjs - 第一次在 React 中使用 API - Openweather API - TypeError: Cannot read property 'temp' of undefined
- python - 如何从.stl文件中提取顶点、面
- javascript - Angular - 类型上不存在属性