2017-09-04 89 views
1

我想在下面嵌套这个多维多维数组,而不使用任何循环获取来自多个多维数组的所有值

我想在这里,对关联或多维数组的作品,但不能把它们放在一起在一个良好的使用来解决我的问题了一些很好的例子:

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 

我试过很多非循环回答关于implode,多维等 我认为他们需要一些修改,如果其中一个元素(level2_4)是数组而不是字符串,它的元素变平。

下面是代码,我发现工作的一些很好的样本,但需要修改,以适应我的情况:

#基本的,但停在一个子阵列:

回声破灭(” ,',call_user_func_array('array_merge',$ data));

#PHP破灭关联数组:

破灭( '',array_map(函数($ K,$ V){返回 “$ K:$ V”;},array_keys($数据), array_values($数据)));

#PHP破灭多维数组:

$导致[0] [代码] = “123”;

$ result [0] [desc] =“Desc123”;

$ result [1] [code] =“567”;

$ result [1] [desc] =“Desc567”; (',',array_map(function($ k,$ v){return“$ k:$ v”;},array_keys(array_column($ result,'desc','code')), array_values(array_column($ result,'desc','code'))));

+1

如何'$海峡= ''; array_walk_recursive($ x,function($ v,$ k)use(&$ str){$ str。= $ k。':'。$ v。',';});',其中'$ x'是你的数组。可能需要一些修剪,但看起来很接近。 – jh1711

+0

@ jh1711 **非常接近!**为什么不在第1级数组([0],[1],[2],...)上组成新行0 - >,1->并发布答案? – Tarik

+1

不需要有几乎相同的竞争答案。 Roman解决了尾随逗号,并获取了$ key - > $ value格式。这就是为什么我投他的答案。对于新行:请参阅我对他的回答的评论。 – jh1711

回答

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

也许'$ result = implode(“\ n”,array_map(...'来得到确切的输出结果,当然你需要丢掉换行符,可读的方式) – jh1711

+0

最后的implode来自@ jh1711,它的工作原理非常完美!感谢! – Tarik

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),','); 
+0

@mickmackusa莫名其妙地错过了那个标准,一直专注于解决方案。交换一个array_walk的foreach足够小。 – Progrock

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 
) 
+0

OP说:“不使用任何循环”我把它解释为/ foreach/while循环(控制结构)或换句话说只使用函数迭代器。 – mickmackusa