Php 从多个多维数组中获取所有值
我想在下面嵌套这个多维数组,而不使用任何循环 我在这里尝试了一些非常好的示例,这些示例适用于关联数组或多维数组,但无法很好地将它们组合在一起以解决我的问题:Php 从多个多维数组中获取所有值,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,我想在下面嵌套这个多维数组,而不使用任何循环 我在这里尝试了一些非常好的示例,这些示例适用于关联数组或多维数组,但无法很好地将它们组合在一起以解决我的问题: Array ( [0] => Array ( [level2_1] => aa [level2_2] => bb [level2_3] => cc [level2_4] => Array
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
或至少:
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)是数组而不是字符串,请展平它的元素
以下是一些我发现有效但需要修改以适合我的情况的代码示例:
#基本但在子数组处停止:
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
echo内爆(',',call_user_func_array('array_merge',$data))
#PHP内爆关联数组:
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
内爆(“,”,数组映射(函数($k,$v){return“$k:$v”;},数组键($data),数组值($data))
#PHP内爆多维数组:
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
$result[0][code]=“123”
$result[0][desc]=“Desc123”
$result[1][code]=“567”
$result[1][desc]=“Desc567”
echo内爆(“,”,array_map(函数($k,$v){return“$k:$v”;}),array_键(array_列($result,'desc,'code')),array_值(array_列($result,'desc,'code'))
除了后面的逗号,差不多都在那里了
<?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";
});
要修复尾随逗号,请将printf行替换为:
print rtrim(sprintf(' %s: %s,', $k, $v),',');
通过组合
array\u键
+array\u walk\u递归
+array\u映射
功能:
// $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>";
?>
怎么样
$str='';数组_walk_recursive($x,函数($v,$k)use(&$str){$str.=$k.:'$v.',';})
,其中$x
是您的数组。可能需要修剪,但看起来很接近。@jh1711非常接近!你为什么不编一行新的0->,1->。。在1级数组([0]、[1]、[2]、…)上发布答案?不需要有几乎相同的竞争答案。Roman解决了尾随逗号的问题,并获得了$key->$value格式。这就是为什么我投票给他的答案。关于新行:请参阅我对他的答案的评论。也许$result=infrade(“\n”,数组映射(…
)可以获得准确的输出。当然,你需要丢失换行符。易读的方法;)最后从@jh1711的评论中进行内爆,它工作得很好!谢谢!OP说:“不使用任何循环”我认为这意味着对/foreach/while循环(控制结构)没有意义,或者换句话说,只使用函数迭代器。@mickmackusa不知怎么地错过了这个标准,专注于解决方案。将foreach替换为数组_walk,这已经够简单了。