多维数组到 CSV - 同时 A) 保留键和 B) 不同长度的数组

Multidimensional array to CSV - while A) preserving keys AND B) different length of arrays

"normal" MultidimArrays 扁平化的答案我发现很多 - 但我找不到适用于这两个警告的解决方案: A)保留钥匙和 B) 不同长度的数组

例如我正在尝试转换它:

array(2) {
  [0]=>
  array(5) {
    ["Name"]=>
    string(9) "Max Muster"
    ["phoneNumbers"]=>
    array(3) {
      [0]=>
      string(7) "1234567"
      [1]=>
      string(7) "2345678"
    }
    ["manager"]=>
    string(13) "None - is CEO"
  }
  [1]=>
  array(5) {
    ["Name"]=>
    string(9) "Ada Brown"   
    ["phoneNumbers"]=>
    array(1) {
      [0]=>
      string(7) "AJP4564"
    }
    ["manager"]=>
    string(10) "Max Muster"
  }

对此:

Name, Max Muster, phoneNumbers, 1234567, 2345678, manager, None - is CEO, Name, Ada Brown, phoneNumbers, AJP4564, manager, Max Muster

...在 csv 中使用

但是这个(简短,不错)解决方案丢失了密钥:

foreach ($arrayMultiDim as $onePerson) {
$arrayOneDim = [];
array_walk_recursive(
    $onePerson,
    function ($oneDim) use (&$arrayOneDim) {
        $arrayOneDim[] = $oneDim . ', ';
    }
);
}

奖金:我在哪里添加“ ”或“;”在写入 CSV 之前创建一个新行? 以及如何避免在一行的最后一个值之后出现“,”?

理想地创造某事。像这样:

Name, Max Muster, phoneNumbers, 1234567, 2345678, manager, None - is CEO
Name, Ada Brown, phoneNumbers, AJP4564, manager, Max Muster

函数array_walk_recursive将忽略父键。所以我认为最好的方法是编写一个新的递归函数,不会忽略它们。下面的函数 array_to_csv 迭代数组的一部分,将键添加到输出(如果它不是数字,因为:电话号码将有 01 等作为键) .然后它检查实际值是否为数组并递归调用该函数。如果它不是数组,它会将值添加到输出。之后它 return 就是结果。

函数:

function array_to_csv( $array, &$out = array() ) {
  foreach( $array as $key => $value ) {
    if( !is_numeric( $key ) ) {
      $out[] = $key;
    }
    if( is_array( $value ) )  {
      array_to_csv( $value, $out );
    } else {
      $out[] = $value;
    }
  }
  return $out;
}

在此 foreach 中,它遍历您的数组并使用数组的每个项目(或 line)调用该函数。然后它内爆 return 并在末尾添加 ;

函数调用:

$csv_array = array();
foreach( $arrayMultiDim as $array ) {
  $csv_array[] = implode(', ', array_to_csv( $array ) ) . ';';
}

您的结果存储在 $csv_array

Array
(
    [0] => Name, Max Muster, phoneNumbers, 1234567, 2345678, manager, None - is CEO;
    [1] => Name, Ada Brown, phoneNumbers, AJP4564, manager, Max Muster;
)