2011-12-23 60 views
35

私はこれでしばらく頭を叩きました。多次元配列を1次元配列に変換する

私はこの多次元配列があります。

Array 
(
    [0] => Array 
     (
      [0] => foo 
      [1] => bar 
      [2] => hello 
     ) 

    [1] => Array 
     (
      [0] => world 
      [1] => love 
     ) 

    [2] => Array 
     (
      [0] => stack 
      [1] => overflow 
      [2] => yep 
      [3] => man 
     ) 

をそして、私はこれを取得する必要があります:任意のアイデア

Array 
(
    [0] => foo 
    [1] => bar 
    [2] => hello 
    [3] => world 
    [4] => love 
    [5] => stack 
    [6] => overflow 
    [7] => yep 
    [8] => man 
) 

を?

私が見つけた他のすべての解決策は、異なるキーを使って多次元配列を解決します。私の配列は、単純な数値キーのみを使用します。

+0

複数のレベルをネストすることはできますか? –

+1

[多次元配列の展開方法](http://stackoverflow.com/questions/1319903/how-to-flatten-a-multidimensional-array)と[他の多くの](http://stackoverflow.com/search?q =%5Bphp%5D +平坦化+ mutlidimensional +配列)。 – deceze

+0

[この記事では私の解決策@見] [1] [1]:http://stackoverflow.com/questions/6940217/multidimensional-array-to-array/13143579#13143579 – Dexy86

答えて

2

解決策:decezeのソリューションも試しましたが、私はhakreのソリューションを使用しました。私は書いた:

$flat = call_user_func_array('array_merge', $array); 

シンプル。

+0

私のために働く、なぜ彼らはdownvoted、このような何か間違っているか分からない? – Dheeraj

+0

私のために働く。私はこれが最も賞賛されたものよりはるかに清潔で明確な答えだと思う。私はなぜ他人がこれを見ていないのだろうかと思います。 :/ – Jefsama

+0

1次元配列に対してのみ機能します。複合型の場合は、 'new = RecursiveIteratorIterator(new \ RecursiveArrayIterator($ myArray))、null);' – stamster

9

これは、本当にすべてそこにある:

foreach($array as $subArray){ 
    foreach($subArray as $val){ 
     $newArray[] = $val; 
    } 
} 
+0

そのないリニアまたはlogN – Bsienn

54
array_reduce($array, 'array_merge', array()) 

例:

$a = array(array(1, 2, 3), array(4, 5, 6)); 
$result = array_reduce($a, 'array_merge', array()); 

結果:

array[1, 2, 3, 4, 5, 6]; 
+0

これは必ずしもこれを実行する最善の方法ではありません。私は機能的アプローチとライティングのためのライナーを書くのが好きです。 ; o) – deceze

+2

2番目の引数は単に 'array_merge'です。 – raugfer

36

PHP array_merge­Docs機能は、あなたの配列をフラット化することができます:

$flat = call_user_func_array('array_merge', $array); 

元の配列が2つのレベルより高い深さを持っている場合は、PHPでのSPLは、あなたがそれを平らにするために使用することができますRecursiveArrayIteratorがあります

$flat = iterator_to_array(new RecursiveIteratorIterator(new RecursiveArrayIterator($array)), 0); 

は、同様に参照してください:How to Flatten a Multidimensional Array?

+1

SPL 'RecursiveIteratorIterator'クラスは、混合配列(N次元とキーの両方が文字列/ ints /配列であるかどうかを問わず)を持つ場合、最良の解決策です。 – stamster

0
$blocked_dates = array(
        '2014' => Array 
         (
          '8' => Array 
           (
            '3' => '1', 
            '4' => '1',          
            '6' => '1',          
            '10' => '1', 
            '15' => '1', 
            '25' => '1' 

           ) 

         ), 
        '2015' => Array 
         (
          '9' => Array 
           (
            '3' => '1', 
            '4' => '1',          
            '6' => '1',          
            '10' => '1', 
            '15' => '1', 
            '25' => '1' 

           ) 

         )  

       ); 

RESUTL(ONE次元アレイ):$ aがあなたの配列名である

$unavailable_dates = array(); 
foreach ($blocked_dates as $year=>$months) { 

    foreach ($months as $month => $days) { 

     foreach ($days as $day => $value) { 

      array_push($unavailable_dates,"$year-$month-$day"); 
     } 

    } 
} 



$unavailable_dates = json_encode($unavailable_dates); 
print_r($unavailable_dates); 

OUTPUT : ["2014-8-3","2014-8-4","2014-8-6","2014-8-10","2014-8-15","2014-8-25","2015-9-3","2015-9-4","2015-9-6","2015-9-10","2015-9-15","2015-9-25"] 
3
foreach ($a as $v1) { 
    foreach ($v1 as $v2) { 
     echo "$v2\n"; 
    } 
} 

for details

+2

これは質問に完全には答えません。 。 (しかし、私は彼らが2年後に解決策を見つけたと思うが、これは掲載されている) – Bun

+0

私は彼らが結果を見つけたと思うが、私は私の意見を共有したい。コメントありがとう、感動はありません:) – n00b

2

最短溶液はarray_walk_recursiveと思わPHP 5.3のように()新しいクロージャの構文では:PHP5.6で

function flatten(array $array) { 
    $return = array(); 
    array_walk_recursive($array, function($a) use (&$return) { $return[] = $a; }); 
    return $return; 
} 
1

機能を組み合わせ、この問題を解決するが、他の方法、array_shift()に元の配列の最初の要素を削除します。array_pus()は新しい配列を追加します。重要なのは... splapt/elipse演算子です。これは引数のようにarray_shitf()の戻り値をアンパックします。

<?php 

$arr = [ 
     ['foo', 'bar', 'hello'], 
     ['world', 'love'], 
     ['stack', 'overflow', 'yep', 'man', 'wow'] 
    ]; 

$new = []; 
while($item = array_shift($arr)){ 
    array_push($new, ...$item); 
} 

print_r($new); 

出力:私は、問題の同じ種類を解決するために、このコードを使用していた

Array 
(
    [0] => foo 
    [1] => bar 
    [2] => hello 
    [3] => world 
    [4] => love 
    [5] => stack 
    [6] => overflow 
    [7] => yep 
    [8] => man 
    [9] => wow 
) 

Example - ideone

+0

1次元配列でのみ動作します。複合的な使用のためには、実際の解決策は '$ new = iterator_to_array(new \ RecursiveIteratorIterator(new \ RecursiveArrayIterator($ myArray))、null);' – stamster

1

。あなたもこれを試すことができます。

function array_flatten($array) { 

if (!is_array($array)) 
{ 
    return FALSE; 
} 
    $result = array(); 
foreach ($array as $key => $value) 
{ 
    if (is_array($value)) 
    { 
    $result = array_merge($result, array_flatten($value)); 
    } 
    else { 
    $result[$key] = $value; 
    } 
} 
return $result; 
}