从多个多维数组中获取所有值

时间:2017-09-04 20:30:35

标签: php arrays multidimensional-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

我尝试了很多关于内爆,多维等的非循环答案。 我认为如果其中一个元素(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'))));

3 个答案:

答案 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
)