Преобразовать многомерный массив в один массив - PullRequest
34 голосов
/ 22 июля 2011

У меня есть многомерный массив без причины

/* This is how my array is currently */
Array
(
[0] => Array
    (
        [0] => Array
            (
                [plan] => basic
            )

        [1] => Array
            (
                [plan] => small
            )

        [2] => Array
            (
                [plan] => novice
            )

        [3] => Array
            (
                [plan] => professional
            )

        [4] => Array
            (
                [plan] => master
            )

        [5] => Array
            (
                [plan] => promo
            )

        [6] => Array
            (
                [plan] => newplan
            )

    )

 )

Я хочу преобразовать этот массив в эту форму

/*Now, I want to simply it down to this*/
Array (
[0] => basic
[1] => small
[2] => novice
[3] => professional
[4] => master
[5] => promo
[6] => newplan
)

Есть идеи, как это сделать?

Ответы [ 17 ]

82 голосов
/ 22 июля 2011

Предполагая, что этот массив может быть или не быть избыточно вложенным, и вы не уверены в том, насколько глубоким он будет, это должно сгладить его для вас:

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; 
} 
69 голосов
/ 12 ноября 2014
$array = array_column($array, 'plan');

Первый аргумент - массив |Второй аргумент - ключ массива.

Примечание: array_column был введен в PHP 5.5 , поэтому он не будет работать в более ранних версиях.

12 голосов
/ 22 июля 2011

Просто назначьте его своему первому элементу:

$array = $array[0];
7 голосов
/ 05 июня 2014
 $singleArray = array();

    foreach ($multiDimensionalArray as $key => $value){
        $singleArray[$key] = $value['plan'];
    }

это лучший способ создать массив из массива multiDimensionalArray.

спасибо

6 голосов
/ 28 февраля 2019

Если вы столкнетесь с многомерным массивом, который является чистыми данными, как показано ниже, то вы можете использовать один вызов array_merge () для выполнения работы с помощью отражения:

$arrayMult = [ ['a','b'] , ['c', 'd'] ];
$arraySingle = call_user_func_array('array_merge', $arrayMult);
// $arraySingle is now = ['a','b', 'c', 'd'];
5 голосов
/ 22 июля 2011

Для этого конкретного случая это подойдет:

$array = array_map('current', $array[0]);

Это в основном тот же вопрос, что и этот, посмотрите на некоторые ответы там: Слияние PHP-массивов с неизвестным числом параметров .

2 голосов
/ 12 июля 2015

Недавно я использовал функцию array_flatten от AlienWebguy, но у меня возникла проблема, найти которую было очень сложно.
array_merge вызывает проблемы, и это не первый раз, когда у меня возникают проблемы с ним.
Если у вас есть те же ключи массива в одном внутреннем массиве, что и в другом, то более поздние значения будут перезаписывать предыдущие в объединенном массиве.

Вот другая версия array_flatten без использования array_merge:

function array_flatten($array) { 
  if (!is_array($array)) { 
    return FALSE; 
  } 
  $result = array(); 
  foreach ($array as $key => $value) { 
    if (is_array($value)) { 
      $arrayList=array_flatten($value);
      foreach ($arrayList as $listItem) {
        $result[] = $listItem; 
      }
    } 
   else { 
    $result[$key] = $value; 
   } 
  } 
  return $result; 
} 
2 голосов
/ 31 января 2013

Вы можете сделать это, просто используя цикл.

    $singleArray = array();

    foreach ($multiDimensionalArray as $key => $value){
        $singleArray[$key] = $value['plan'];
    }
1 голос
/ 26 февраля 2019

Несмотря на то, что array_column будет хорошо работать здесь, в случае, если вам нужно сгладить любой массив независимо от его внутренней структуры, вы можете использовать эту библиотеку массивов , чтобы достичь этого без труда :

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

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

1 голос
/ 28 октября 2018

Ваш массив образцов имеет 3 уровня.Поскольку первый уровень имеет только [0], вы можете жестко закодировать свой доступ к нему и избежать дополнительного вызова функции / конструкции.

( Code Demos )

  1. array_walk_recursive () удобен и универсален, но для этой задачи может быть излишним и, конечно, немного более запутанным с точки зрения читабельности.

    array_walk_recursive($array, function($leafvalue)use(&$flat){$flat[] = $leafvalue;});
    var_export($flat);
    
  2. Если бы это был мой код, я бы использовал array_column () , потому что он прямой и говорит буквально о выполняемом действии.

    var_export(array_column($array[0], 'plan'));
    
  3. OfКонечно, пара циклов `foreach () будет работать очень эффективно, потому что языковые конструкции, как правило, работают более эффективно, чем вызовы функций.

    foreach ($array[0] as $plans) {
        foreach ($plans as $value) {
            $flat[] = $value;
        }
    }
    var_export($flat);
    
  4. Наконец, в стиле фанкальтернативный вариант (который я не могу себе представить, фактически использующий, если я не писал код для кого-то, о ком я не заботился), я предложу вызов array_merge_recursive () с оператором splat (...).

    var_export(array_merge_recursive(...$array[0])['plan']);
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...