2015-07-15 1 views
0

Рассмотрим следующий пример:Доступ вложенных массивов в PHP без многих циклов

$dropdown = array (
    "unitofmeasure" => array (
     "m"  => "meters", 
     "ft" => "feet" 
    ), 
    "facing_direction" => array (
     "0"  => array ("West","North-West","North","North-East","East","South-East"), 
     "1"  => array("South","South-West") 
    ) 
    .... 
) 

Предположим, есть п число вспомогательных массивов, а не только две показано выше.

Итерация решение:

foreach($dropdown as $key => $val) { 
    foreach($val as $k => $v) { 
     foreach($v as $id => $value) { 
      //manipulate values here 
     } 
    } 
} 

Мой вопрос:

есть не более элегантное решение, доступное в PHP?
, например что-то вроде foreach($dropdown->children()->children() ...)

Я знаю, что есть несколько полу-подобные вопросы на SO, но они немного отличаются и ответы посредственно.

ответ

1

Да, я лично предпочитаю использовать array_walk_recursive с закрытием (если вы используете PHP выше 5.3).

Возможно, вы также можете использовать рекурсию, если хотите, чтобы ваши руки были грязными.

Я полагаю, пример в порядке:

$array = [ 0 => [0 => [ 0 => 1 ...]]]; 

$manipulated_array = []; 

array_walk_recursive($array, function($value) use (&$manipulated_array) 
{ 
    // do whatever you wish here 
}); 
+0

[RecursiveArrayIterator] (http://php.net/manual/en/class.recursivearrayiterator.php) также будет вариантом. – Orangepill

+1

Хороший звонок, забыли об этом. Другим вариантом будет ['RecursiveIteratorIterator'] (http://php.net/manual/en/class.recursiveiteratoriterator.php) - который имеет глупое имя. – Andrew

1

Еогеасп() просто ожидает массив, так что если вам нужно только повторять один из тех, глубоко вложенных массивов, то вы вполне можете легко иметь

foreach($arr['level1']['level2'][...]['levelGazillion'] as ...) 
0

Я предпочитаю использовать рекурсию в таких ситуациях:

function modify_array(&$arr) 
{ 
    if (is_array(arr)) { 
     foreach($arr as &$val) { 
      modify_array($val); 
     } 
    } else { 
     modify_value($arr); 
    } 
} 

где modify_value(&$val) - это то, что вы хотите сделать для каждого не-массивного ребенка на любой произвольной глубине.

Смежные вопросы