Цикл из массива array

#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();