2016-06-29 5 views
0

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

$array = [ 
    'car' => [ 
     'BMW' => 'blue', 
     'toyota' => 'gray' 
     ], 
    'animal' => [ 
     'cat' => 'orange', 
     'horse' => 'white' 
     ] 
    ]; 

Тогда, я хочу, чтобы получить все значения (цвет, 'blue', 'gray', 'orange', 'white') и присоединиться к ним в один массив. Как мне это сделать без использования foreach дважды?

Заранее спасибо.

+0

Написать функцию, которая использует 'для-each' дважды, а затем просто вызвать эту функцию. –

+0

У меня есть, но не повлияет ли это на производительность каждый раз, когда я его назову? – Vaivez66

+0

Я не очень хорошо знаком с PHP, поэтому я не знаю, есть ли встроенная функция, которая может достичь того, чего вы хотите, и не использует вложенные для циклов. Я бы не стал беспокоиться об итерации по двум массивам, если только это не заметно. Преждевременная оптимизация - это корень всего зла. –

ответ

0

Попробуйте это:

function get_values($array){ 
    foreach($array as $key => $value){ 
     if(is_array($array[$key])){ 
      print_r (array_values($array[$key])); 
     } 
    } 
} 

get_values($array); 
0

Если вы не заботитесь о индексах, то это следует сделать это:

$colors = array(); 
foreach ($array as $item) { 
    $colors = array_merge($colors, array_values($item)); 
} 

Если вы хотите, чтобы индексы вы могли бы использовать:

$colors = array(); 
foreach ($array as $item) { 
    // this leaves you open to elements overwriting each other depending on their keys 
    $colors = array_merge($colors, $item); 
} 

Я надеюсь, что это помогает.

1

Как я могу это сделать без использования Еогеасп дважды?

Первого использование RecursiveIteratorIterator класса для выравнивания многомерного массива, а затем применить array_values() функции, чтобы получить желаемые значения цвета в одном массиве.

Вот ссылки:

Так что ваш код должен выглядеть так:

$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($array)); 
$flatten_array = array_values(iterator_to_array($iterator,true)); 

// display $flatten_array 
echo "<pre>"; print_r($flatten_array); 

Вот live demo

0

Вот рекурсивная функция, которая дает вам возможность получить массив этих значений конечной точки или получить массив со всеми ключами без изменений, но просто сплющивается.

Код:

<?php 

$array = [ 
    'car' => [ 
     'BMW' => 'blue', 
     'toyota' => 'gray' 
     ], 
    'animal' => [ 
     'cat' => 'orange', 
     'horse' => 'white' 
     ] 
    ]; 

// 
print "\n<br> Array (Original): ".print_r($array,true); 
print "\n<br> Array (Flattened, With Keys): ".print_r(FlattenMultiArray($array,true),true); 
print "\n<br> Array (Flattened, No Keys): ".print_r(FlattenMultiArray($array,false),true); 

// 
function FlattenMultiArray($array,$bKeepKeys=true,$key_prefix='') 
{ 
    // 
    $array_flattened=Array(); 

    // 
    foreach($array as $key=>$value){ 

     // 
     if(Is_Array($value)){ 
      $array_flattened=Array_Merge(
       $array_flattened, 
       FlattenMultiArray($value,$bKeepKeys,$key) 
      ); 
     } 
     else{ 
      if($bKeepKeys){ 
       $array_flattened["{$key_prefix}_{$key}"]=$value; 
      } 
      else{ 
       $array_flattened[]=$value; 
      } 
     } 
    } 

    return $array_flattened; 
} 

?> 

Выходы:

<br> Array (Original): Array 
(
    [car] => Array 
     (
      [BMW] => blue 
      [toyota] => gray 
     ) 

    [animal] => Array 
     (
      [cat] => orange 
      [horse] => white 
     ) 

) 

<br> Array (Flattened, With Keys): Array 
(
    [car_BMW] => blue 
    [car_toyota] => gray 
    [animal_cat] => orange 
    [animal_horse] => white 
) 

<br> Array (Flattened, No Keys): Array 
(
    [0] => blue 
    [1] => gray 
    [2] => orange 
    [3] => white 
) 
Смежные вопросы