首页 > 解决方案 > 将多维数组的 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);
                }
            }

但我想知道是否有更好的方法来做到这一点。

标签: phparraysjsoncsv

解决方案


我创建了一个如下所示的数组,请检查它是否对您有帮助:

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

推荐阅读