【问题标题】:Multidimensional array to CSV - while A) preserving keys AND B) different length of arrays多维数组到 CSV - 同时 A)保留键和 B)不同长度的数组
【发布时间】:2020-06-22 07:05:42
【问题描述】:

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 . ', ';
    }
);
}

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

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

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

【问题讨论】:

  • 只是几个问题。为什么 CSV 的第一行没有标题,而其余行没有数据?其次,CSV 通常有固定数量的列吗?最后,为什么需要保留密钥?
  • 你是对的 - 通常我会将第一行作为标题,其他行作为数据。但是这样我可以很容易地分解它并随后添加新的字段。这也是我想保留钥匙的原因。

标签: php arrays flatten


【解决方案1】:

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

功能:

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)调用该函数。然后它内爆返回并在末尾添加;

函数调用:

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

【讨论】:

  • 非常感谢您提供代码和解释!效果很好!
猜你喜欢
  • 2013-08-21
  • 2011-12-12
  • 2020-01-17
  • 2021-09-13
  • 2013-05-23
  • 2023-01-14
  • 2016-03-11
  • 2011-12-14
  • 1970-01-01
相关资源
最近更新 更多