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,这已经够简单了。