2017-09-04 86 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