我想在下面嵌套这个多维多维数组,而不使用任何循环。
我在这里尝试了一些非常好的例子,这些例子适用于关联或多维数组,但不能很好地将它们放在一起以解决我的问题:
Array
(
[0] => Array
(
[level2_1] => aa
[level2_2] => bb
[level2_3] => cc
[level2_4] => Array
(
[level3_1] => DDD
[level3_2] => EEE
)
)
[1] => Array
(
[level2_1] => ff
[level2_2] => gg
[level2_3] => hh
[level2_4] => Array
(
[level3_1] => III
[level3_2] => JJJ
)
)
)
预期输出:
0 -> level2_1: aa, level2_2: bb, level2_3: cc, level3_1: DDD, level3_2: EEE
1 -> level2_1: ff, level2_2: gg, level2_3: hh, level3_1: III, level3_2: JJJ
或至少:
0: aa, bb, cc, DDD, EEE
1: ff, gg, hh, III, JJJ
我尝试了很多关于内爆,多维等的非循环答案。 我认为如果其中一个元素(level2_4)是数组而不是字符串,则需要进行一些修改,将其元素展平。
以下是我发现的一些很好的代码示例,但需要根据我的情况进行修改:
#Basic但在子阵列处停止:
echo implode(',',call_user_func_array('array_merge',$ data));
#PHP implode associative array:
implode(',',array_map(function($ k,$ v){return“$ k:$ v”;},array_keys($ data),array_values($ data)));
#PHP内爆多维数组:
$ result [0] [code] =“123”;
$ result [0] [desc] =“Desc123”;
$ result [1] [code] =“567”;
$ result [1] [desc] =“Desc567”;
echo implode(',',array_map(function($ k,$ v){return“$ k:$ v”;},array_keys(array_column($ result,'desc','code')),array_values (array_column($ result,'desc','code'))));
答案 0 :(得分:3)
结合array_keys
+ array_walk_recursive
+ array_map
函数:
// $arr is your initial array
$result = array_map(function($k) use($arr){
$s = "$k ->"; // key prefix
array_walk_recursive($arr[$k], function($v, $k) use(&$s){
$s .= " $k: $v,";
});
return trim($s, ',');
}, array_keys($arr));
print_r($result);
输出:
Array
(
[0] => 0 -> level2_1: aa, level2_2: bb, level2_3: cc, level3_1: DDD, level3_2: EEE
[1] => 1 -> level2_1: ff, level2_2: gg, level2_3: hh, level3_1: III, level3_2: JJJ
)
答案 1 :(得分:0)
除了尾随逗号外,几乎就是那里。
<?php
$data =
[
[
'level2_1' => 'aa',
'level2_2' => 'bb',
'level2_3' => 'cc',
'level2_4' =>
[
'level3_1' => 'DDD',
'level3_2' => 'EEE'
]
],
[
'level2_1' => 'ff',
'level2_2' => 'gg',
'level2_3' => 'hh',
'level2_4' =>
[
'level3_1' => 'III',
'level3_2' => 'JJJ'
]
]
];
array_walk($data, function($v, $k) {
print "$k ->";
array_walk_recursive($v, function($v, $k) {
printf(' %s: %s,', $k, $v);
});
print "\n";
});
输出:
0 -> level2_1: aa, level2_2: bb, level2_3: cc, level3_1: DDD, level3_2: EEE,
1 -> level2_1: ff, level2_2: gg, level2_3: hh, level3_1: III, level3_2: JJJ,
要修复尾随逗号,请将printf行交换为:
print rtrim(sprintf(' %s: %s,', $k, $v),',');
答案 2 :(得分:0)
可能,您可以尝试这样的不同方式:
<?php
function Recursive($data){
$ritit = new RecursiveIteratorIterator(new RecursiveArrayIterator($data));
$result = array();
foreach ($ritit as $leafValue) {
$keys = array();
foreach (range(0, $ritit->getDepth()) as $depth) {
$keys[] = $ritit->getSubIterator($depth)->key();
}
$result[ join('.', $keys) ] = $leafValue;
}
return $result;
}
$data =
[
[
'level2_1' => 'aa',
'level2_2' => 'bb',
'level2_3' => 'cc',
'level2_4' =>
[
'level3_1' => 'DDD',
'level3_2' => 'EEE'
]
],
[
'level2_1' => 'ff',
'level2_2' => 'gg',
'level2_3' => 'hh',
'level2_4' =>
[
'level3_1' => 'III',
'level3_2' => 'JJJ'
]
]
];
$recursive = Recursive($data);
echo "<pre>".print_r($recursive,1)."<pre>";
?>
输出:
Array
(
[0.level2_1] => aa
[0.level2_2] => bb
[0.level2_3] => cc
[0.level2_4.level3_1] => DDD
[0.level2_4.level3_2] => EEE
[1.level2_1] => ff
[1.level2_2] => gg
[1.level2_3] => hh
[1.level2_4.level3_1] => III
[1.level2_4.level3_2] => JJJ
)