Превращение многомерного массива в одномерный массив - PullRequest
47 голосов
/ 23 декабря 2011

Я бьюсь головой об этом уже некоторое время.

У меня есть этот многомерный массив:

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
)

Есть идеи?

Все другие найденные мной решения решают многомерные массивы с разными ключами. В моих массивах используются только простые цифровые клавиши.

Ответы [ 11 ]

73 голосов
/ 23 декабря 2011
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];
38 голосов
/ 23 декабря 2011

Функция PHP array_merge & shy; Docs может сгладить ваш массив:

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

Если исходный массив имеет более высокую глубину, чем 2 уровня, SPL в PHP имеет RecursiveArrayIterator, который можно использовать для его выравнивания:

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

См. Также: Как выровнять многомерный массив? .

9 голосов
/ 23 декабря 2011

Это действительно все, что нужно сделать:

foreach($array as $subArray){
    foreach($subArray as $val){
        $newArray[] = $val;
    }
}
6 голосов
/ 25 апреля 2018

Начиная с PHP 5.6 это можно сделать проще с помощью распаковки аргумента .

$flat = array_merge(...$array);
3 голосов
/ 06 июня 2016

Начиная с 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 голосов
/ 15 августа 2014
foreach ($a as $v1) {
    foreach ($v1 as $v2) {
        echo "$v2\n";
    }
}

где $ a - имя вашего массива. для деталей

1 голос
/ 16 июля 2018

Это составит

array_walk_recursive($array, function($a) use (&$return) { $return[] = $a; });
1 голос
/ 05 октября 2016

Я использовал этот код для решения того же типа проблемы. так что вы можете попробовать это.

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 голос
/ 15 июля 2016

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

Пример - ideone

0 голосов
/ 26 февраля 2019

Самое быстрое решение - использовать эту библиотеку массивов :

$flattened = Arr::flatten($yourArray);

, которая будет производить именно тот массив, который вам нужен

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...