将多维数组转换为一维数组

59

我已经苦思冥想了一段时间。

我有一个多维数组:

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
)

有什么想法吗?

我发现其他解决方案都是针对具有不同键的多维数组。而我的数组只使用简单的数字键。


数组可以嵌套多于一层吗? - Filip Roséen - refp
1
重复的问题:如何展平多维数组?(https://dev59.com/qnM_5IYBdhLWcg3wlEFH)和其他很多类似的问题(http://stackoverflow.com/search?q=%5Bphp%5D+flatten+mutlidimensional+array)。 - deceze
请查看我的解决方案,链接在这篇帖子中:点击这里 - Dexy86
11个回答

90
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];

这不一定是最好的方式,可能对某些人来说有点晦涩;我只是喜欢使用函数式方法和写一行代码来练习。;o) - deceze
2
第二个参数可以直接是'array_merge'。 - raugfer

42

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

参见:如何展开多维数组?


1
当您拥有一个混合数组(键既包含N维度,又包含字符串/整数/非数组的键)时,SPL RecursiveIteratorIterator类是最佳解决方案。 - stamster
它只返回数组的值而不是键。我怎么才能得到键和值? - Chirag Patel
@ChiragPatel:对(多个)数组进行递归迭代经常会出现键冲突。然而,递归迭代也提供了键,只需将iterator_to_array()的第二个参数$use_keys设置为true即可,参见http://php.net/iterator_to_array。 - hakre

25

1
从PHP 7.4开始,如果$array的计数为零(正好是这种情况),这也将起作用。 - hakre
这是今天最清晰简单的解决方案。 - Jules Colle

12

这确实就是全部内容:

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

它不是线性的或对数N。 - Abdul Rehman

3

从PHP 5.3开始,最简短的解决方案似乎是使用带有新闭包语法的array_walk_recursive():

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

3
foreach ($a as $v1) {
    foreach ($v1 as $v2) {
        echo "$v2\n";
    }
}

$a是你的数组名称。 详情请见


2
这并没有完全回答问题,他想用值填充一个新数组。(不过我认为自从这个问题发布以来已经有两年了,他们可能已经找到了解决方案) - Bun
我也认为他们找到了结果,但我只是想分享我的观点。谢谢你的评论,没有恶意 :) - n00b

1

这将会使

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

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

1
在PHP5.6中,解决这个问题的另一种方法是将函数array_shift()array_push()结合使用。使用...运算符可以像参数一样展开array_shift()的返回值。重要的是使用array_shift()删除原始数组的第一个元素,使用array_push()将项目添加到新数组中,保留HTML标签。
<?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
)

示例 - ideone


仅适用于单维数组。对于混合使用,唯一可行的解决方案是 $new = iterator_to_array(new \RecursiveIteratorIterator(new \RecursiveArrayIterator($myArray)), null); - 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'

                                )

                        )    

                );

结果(一维数组):

$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"]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接