2011-12-23 132 views
35

我已经在这一段时间里撞了我一会儿。将多维数组转换为一维数组

我有这样的多维数组:

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

数组可以嵌套多个级别吗? – 2011-12-23 01:26:45

+1

复制[如何压扁多维数组?](http://stackoverflow.com/questions/1319903/how-to-flatten-a-multidimensional-array)和[许多其他](http://stackoverflow.com /查询q =%5Bphp%5D +弄平+ mutlidimensional +数组)。 – deceze 2011-12-23 01:27:16

+0

[看@我在这个岗位的解决方案] [1] [1]:http://stackoverflow.com/questions/6940217/multidimensional-array-to-array/13143579#13143579 – Dexy86 2012-10-30 20:29:49

回答

2

解决方案:我使用hakre的解决方案,尽管我也尝试过deceze的解决方案,并且它也能正常工作。我写道:

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

很简单。

+0

适合我,不知道他们为什么downvoted,这种方式有什么问题吗? – Dheeraj 2017-02-20 13:33:41

+0

适合我。我认为这是一个比最上层的答案更清楚明确的答案。我想知道为什么别人没有看到这一点。 :/ – Jefsama 2017-03-02 09:54:52

+0

仅适用于单维数组。对于混合使用,只有工作解决方案是'$ new = iterator_to_array(new \ RecursiveIteratorIterator(new \ RecursiveArrayIterator($ myArray)),null);' – stamster 2017-10-03 09:31:45

9

这的确是所有有给它:

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

它不是线性或logN – Bsienn 2015-04-10 21:56:30

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 2011-12-23 01:33:41

+2

第二个参数可能只是'array_merge'。 – raugfer 2013-12-22 22:45:33

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

当你有一个混合数组(键的N维和键都是字符串/整数/不是数组)时,SPL'RecursiveIteratorIterator'类是最好的解决方案。 – stamster 2017-10-03 09:33:07

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(一个维数组):

$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

这并不完全回答问题,他想用值填充一个新数组。 (但是,我认为他们发现了一个解决方案,因为这已经发布了两年) – Bun 2014-08-15 18:21:18

+0

我也认为他们找到了结果,但我只是想分享我的观点。感谢您的评论,没有难过的感觉:) – n00b 2014-08-15 20:50:57

2

由于PHP 5.3最短的解决方案似乎是array_walk_recursive()用新的封闭语法:

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

在PHP5.6还有其他的方式来解决这个问题,结合功能,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

仅适用于单维阵列。对于混合使用,只有工作解决方案是'$ new = iterator_to_array(new \ RecursiveIteratorIterator(new \ RecursiveArrayIterator($ myArray)),null);' – stamster 2017-10-03 09:32:04

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; 
}