多维数组到 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
迭代数组的一部分,将键添加到输出(如果它不是数字,因为:电话号码将有 0
和 1
等作为键) .然后它检查实际值是否为数组并递归调用该函数。如果它不是数组,它会将值添加到输出。之后它 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;
)
"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
迭代数组的一部分,将键添加到输出(如果它不是数字,因为:电话号码将有 0
和 1
等作为键) .然后它检查实际值是否为数组并递归调用该函数。如果它不是数组,它会将值添加到输出。之后它 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;
)