Подтвердить что ты не робот

Преобразование многомерного массива в один массив

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

/* 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
)

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

4b9b3361

Ответ 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; 
} 

Ответ 2

$array = array_column($array, 'plan');

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

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

Ответ 3

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

$array = $array[0];

Ответ 4

 $singleArray = array();

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

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

спасибо

Ответ 5

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

$arrayMult = [ ['a','b'] , ['c', 'd'] ];
$arraySingle = call_user_func_array('array_merge', $arrayMult);
// $arraySingle is now = ['a','b', 'c', 'd'];

Ответ 7

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

    $singleArray = array();

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

Ответ 8

Недавно я использовал функцию AlienWebguy array_flatten, но это дало мне проблему, из-за которой было очень сложно найти причину. 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; 
} 

Ответ 9

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

(Код Демо)

  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. Конечно, пара циклов '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']);
    

Ответ 10

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

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

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

Ответ 11

Я сделал это с стилем ООП

$res=[1=>[2,3,7,8,19],3=>[4,12],2=>[5,9],5=>6,7=>[10,13],10=>[11,18],8=>[14,20],12=>15,6=>[16,17]];
class MultiToSingle{
public $result=[];
public function __construct($array){
    if(!is_array($array)){
        echo "Give a array";
    }
    foreach($array as $key => $value){
        if(is_array($value)){
            for($i=0;$i<count($value);$i++){
                $this->result[]=$value[$i];
            }  
        }else{
            $this->result[]=$value;
        }
    }
}
}

$obj= new MultiToSingle($res);
$array=$obj->result;
print_r($array);

Ответ 12

Многомерный массив для одиночного массива с одним строковым кодом!!! Наслаждайтесь кодом.

$array=[1=>[2,5=>[4,2],[7,8=>[3,6]],5],4];
$arr=[];
array_walk_recursive($array, function($k){global $arr; $arr[]=$k;});
print_r($arr);

... Наслаждайтесь кодом.

Ответ 13

Следуя этой схеме

$input = array(10, 20, array(30, 40), array('key1' => '50', 'key2'=>array(60), 70));

Вызовите функцию:

echo "<pre>";print_r(flatten_array($input, $output=null));

Объявление функции:

function flatten_array($input, $output=null) {
if($input == null) return null;
if($output == null) $output = array();
foreach($input as $value) {
    if(is_array($value)) {
        $output = flatten_array($value, $output);
    } else {
        array_push($output, $value);
    }
}
return $output;

}

Ответ 14

Я написал дополнение к принятому ответу. Если кому-то, как и мне, нужна префиксная версия ключей, это может быть полезно.

Array
(
    [root] => Array
        (
            [url] => http://localhost/misc/markia
        )

)
Array
(
    [root.url] => http://localhost/misc/markia
)
<?php
function flattenOptions($array, $old = '') {
  if (!is_array($array)) {
    return FALSE;
  }
  $result = array();
  foreach ($array as $key => $value) {
    if (is_array($value)) {
      $result = array_merge($result, flattenOptions($value, $key));
    }
    else {
      $result[$old . '.' . $key] = $value;
    }
  }
  return $result;
}

Ответ 15

ни один из ответов не помог мне, если у меня было несколько уровней вложенных массивов. решение почти такое же, как у @AlienWebguy, но с небольшой разницей.

function nestedToSingle(array $array)
{
    $singleDimArray = [];

    foreach ($array as $item) {

        if (is_array($item)) {
            $singleDimArray = array_merge($singleDimArray, nestedToSingle($item));

        } else {
            $singleDimArray[] = $item;
        }
    }

    return $singleDimArray;
}

тестовый пример

$array = [
        'first',
        'second',
        [
            'third',
            'fourth',
        ],
        'fifth',
        [
            'sixth',
            [
                'seventh',
                'eighth',
                [
                    'ninth',
                    [
                        [
                            'tenth'
                        ]
                    ]
                ],
                'eleventh'
            ]
        ],
        'twelfth'
    ];

    $array = nestedToSingle($array);
    print_r($array);

    //output
    array:12 [
        0 => "first"
        1 => "second"
        2 => "third"
        3 => "fourth"
        4 => "fifth"
        5 => "sixth"
        6 => "seventh"
        7 => "eighth"
        8 => "ninth"
        9 => "tenth"
        10 => "eleventh"
        11 => "twelfth"
   ]

Ответ 16

$flattenArray = [];

foreach ($parentArray as $childArray) {
    foreach ($childArray as $value) {
        $flattenArray[] = $value;
    }
}

Ответ 17

Попробуйте это, это работает для меня:

    $newArray = array();
            foreach($operator_call_logs as $array) {
                foreach($array as $k=>$v) {
                    $newArray[$k] = $v;
                }
            }

Ответ 18

Сохраните это как файл php, просто импортируйте и используйте функцию single_array()

<?php
$GLOBALS['single_array']=[];
function array_conveter($array_list){
    if(is_array($array_list)){
        foreach($array_list as $array_ele){
            if(is_array($array_ele)){
                array_conveter($array_ele);
            }else{
                array_push($GLOBALS['single_array'],$array_ele);
            }
        }
    }else{
        array_push($GLOBALS['single_array'],$array_list);
    }
}
function single_array($mix){
    foreach($mix as $single){
        array_conveter($single);
    }return $GLOBALS['single_array'];
    $GLOBALS['single_array']=[];
}
/* Example convert your multi array to single  */
$mix_array=[3,4,5,[4,6,6,7],'abc'];
print_r(single_array($mix_array));

?>