#php #loops #multidimensional-array
#php #циклы #многомерный массив
Вопрос:
в PHP, как я могу зациклить массив array, не зная, является ли это массивом или нет?
Лучше с примером:
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
)
}
есть идеи? Спасибо.
Ответ №1:
Какой подход выбрать, зависит от того, что вы хотите сделать с данными.
array_walk_recursive
[docs] позволяет рекурсивно просматривать массив массивов.
Ответ №2:
Вы можете использовать is_array, чтобы проверить, является ли этот элемент массивом, если это так, выполнить цикл по нему рекурсивно.
Ответ №3:
Вы можете использовать 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)
}
Рекурсивный итератор работает на нескольких уровнях глубины.
Ответ №4:
foreach( $array as $value ) {
if( is_array( $value ) ) {
foreach( $value as $innerValue ) {
// do something
}
}
}
Это сработало бы, если вы знаете, что это будет максимум 2 уровня вложенного массива. Если вы не знаете, сколько уровней вложенности, тогда вам нужно будет использовать рекурсию. Или вы можете использовать такую функцию, как array_walk_recursive
Ответ №5:
$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();