我想弄平一个行的数组 - 每个行都具有可变的深度 - 使其成为一系列关联数组。
我在这里尝试了一些非常好的示例,这些示例适用于关联或多维数组,但无法将它们放在一起解决我的问题:
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)是数组而不是字符串,则需要进行一些修改。
这是我发现工作的一些好的代码样本,但需要修改以适合我的案例:
#基本,但停在子阵列上:
echo爆炸(',',call_user_func_array('array_merge',$ data));
#php爆破联想数组:
umpode(',',array_map(函数($ k,$ v){return $ k:$ v&v"},array_keys($ data),array_values($ data));
>#php爆破多维数组:
$结果[0] [代码] =" quert;;
$结果[0] [desc] =" desc123"
$结果[1] [代码] =" 567;
$结果[1] [desc] =" desc567"
echo爆炸(',',array_map(函数($ k,$ v){return $ k:$ k:$ v"},array_keys(array_column($ result,'desc,'desc'code'code')),array_values(array_column($ result,'desc','code'code'))));
与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
)
可能是,您可以尝试其他方式:
<?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
)
几乎在那里,但对于拖延逗号。
<?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),',');