в PHP, как я могу зацикливать массив массива, не зная, есть он или нет?
Лучше с примером:
Array ( [0] => Array ( [0] => big [1] => small ) [1] => Array ( [0] => big [1] => tiny ) [2] => Array ( [0] => a [1] => b [2] => c [3] => d [4] => e [5] => f ) [3] => row [4] => cols [5] => blablabla [6] => Array ( [0] => asd [1] => qwe ) }
Есть идеи? Благодарю.
Вы можете использовать is_array
чтобы проверить, является ли что-то массивом, и / или вы можете использовать is_object
чтобы проверить, можно ли его использовать в foreach
:
foreach ($arr as $val) { if (is_array($val) || is_object($val)) { foreach ($val as $subval) { echo $subval; } } else { echo $val; } }
Другой альтернативой является использование RecursiveIteratorIterator
:
$it = new RecursiveIteratorIterator( new RecursiveArrayIterator($arr), RecursiveIteratorIterator::SELF_FIRST); foreach($it as $value) { # ... (each value) }
Рекурсивный итератор работает для нескольких уровней в глубину.
Какой подход выбрать, зависит от того, что вы хотите делать с данными.
array_walk_recursive
[docs] позволяет рекурсивно перемещать массив массивов.
Вы можете использовать is_array для проверки того, является ли этот элемент массивом, если он есть, перебирает его рекурсивно.
foreach( $array as $value ) { if( is_array( $value ) ) { foreach( $value as $innerValue ) { // do something } } }
Это будет работать, если вы знаете, что это будет максимум 2 уровня вложенного массива. Если вы не знаете, сколько уровней гнездования вам нужно будет использовать рекурсию. Или вы можете использовать такую функцию, как array_walk_recursive
$big_array = array(...); function loopy($array) { foreach($array as $element) { if(is_array($element)) { // Keep looping -- IS AN ARRAY-- loopy($element); } else { // Do something for this element --NOT AN ARRAY-- } } } loopy();