Цикл foreach PHP перебрать массив

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

Пример записи и результат:

<?php

$testarray = array(
    1 => 'item1',
    2 => 'item2',
    3 => 'item3',
    4 => 'item4',
    5 => 'item1',
    6 => 'item6',
    7 => 'item7',
);

foreach($testarray as $key => $value){
    echo "Ключ: $key - Значение: $value<br>";
}

?>

В примере выше, был объявлен массив, а затем в цикле foreach был перебран. На каждой итерации в $key — попадает ключ массива, а в $value значение.

Результат:

Ключ: 1 - Значение: item1
Ключ: 2 - Значение: item2
Ключ: 3 - Значение: item3
Ключ: 4 - Значение: item4
Ключ: 5 - Значение: item1
Ключ: 6 - Значение: item6
Ключ: 7 - Значение: item7

С простым массивом никаких сложностей, а вот если в значении будет тоже массив, ниже новый пример и результат:

<?php

$testarray = array(
    1 => 'item1',
    2 => 'item2',
    3 => 'item3',
    4 => 'item4',
    5 => 'item1',
    6 => 'item6',
    7 => array(
        1 => 'depth2 item1',
        2 => 'depth2 item2',
        3 => 'depth2 item3',
        4 => 'depth2 item4',
    )
);

foreach($testarray as $key => $value){
    echo "Ключ: $key - Значение: $value<br>";
}

?>

Результат:

Ключ: 1 - Значение: item1
Ключ: 2 - Значение: item2
Ключ: 3 - Значение: item3
Ключ: 4 - Значение: item4
Ключ: 5 - Значение: item1
Ключ: 6 - Значение: item6
Ключ: 7 - Значение: Array

В итоге мы просто видим, что значение ячейки 7 — это массив, при этом он может быть и более глубокого уровня вложенности. Для переборки многомерного массива, можно воспользоваться конструкцией из примера ниже, где в цикле foreаch проверяется при помощи функции is_array() является ли $value массивом и если так, то запускается еще один foreach внутри первого, где массивом передается $value

<?php

$testarray = array(
    1 => 'item1',
    2 => 'item2',
    3 => 'item3',
    4 => 'item4',
    5 => 'item1',
    6 => 'item6',
    7 => array(
        1 => 'depth2 item1',
        2 => 'depth2 item2',
        3 => 'depth2 item3',
        4 => 'depth2 item4',
    )
);

foreach($testarray as $key => $value){
    if(is_array($value)){
        foreach($value as $k => $v){
            echo "Ключ: $k - Значение: $v<br>";
        }
    }else{
        echo "Ключ: $key - Значение: $value<br>";
    }
    
}

?>

Результат:

Ключ: 1 - Значение: item1
Ключ: 2 - Значение: item2
Ключ: 3 - Значение: item3
Ключ: 4 - Значение: item4
Ключ: 5 - Значение: item1
Ключ: 6 - Значение: item6
Ключ: 1 - Значение: depth2 item1
Ключ: 2 - Значение: depth2 item2
Ключ: 3 - Значение: depth2 item3
Ключ: 4 - Значение: depth2 item4

Если знать заранее уровень вложенности многомерного массива, то без проблем можно написать жесткую конструкцию, на 2,3,5 или более проверок. Если же это каждый раз может быть разный уровень вложенности, то тогда лучшим решением будет написать рекурсивную функцию. Ниже пример реализации, конечно тут просто вывод на экран, в реальной жизни могут быть применены другие действия.

<?php

$testarray = array(
    1 => 'item1',
    2 => 'item2',
    3 => 'item3',
    4 => 'item4',
    5 => 'item1',
    6 => 'item6',
    7 => array(
        1 => '-- depth2 item1',
        2 => '-- depth2 item2',
        3 => '-- depth2 item3',
        4 => array(
           1 => '--- depth3 item1',
           2 => '--- depth3 item2',
           3 => '--- depth3 item3',
           4 => '--- depth3 item4',
           5 => '--- depth3 item5',
           6 => array(
               1 => '--- depth4 item1',
               2 => '--- depth4 item2',
               3 => '--- depth4 item3',
               4 => '--- depth4 item4',
               5 => '--- depth4 item5',
           ),
        ),
    )
);


function arrrec($arr){
    foreach($arr as $key => $value){
        if(is_array($value)){
            arrrec($value);
        }else{
            echo "Ключ: $key - Значение: $value<br>";
        }

    }
}

arrrec($testarray);

?>

Результат:

Ключ: 1 - Значение: item1
Ключ: 2 - Значение: item2
Ключ: 3 - Значение: item3
Ключ: 4 - Значение: item4
Ключ: 5 - Значение: item1
Ключ: 6 - Значение: item6
Ключ: 1 - Значение: -- depth2 item1
Ключ: 2 - Значение: -- depth2 item2
Ключ: 3 - Значение: -- depth2 item3
Ключ: 1 - Значение: --- depth3 item1
Ключ: 2 - Значение: --- depth3 item2
Ключ: 3 - Значение: --- depth3 item3
Ключ: 4 - Значение: --- depth3 item4
Ключ: 5 - Значение: --- depth3 item5
Ключ: 1 - Значение: --- depth4 item1
Ключ: 2 - Значение: --- depth4 item2
Ключ: 3 - Значение: --- depth4 item3
Ключ: 4 - Значение: --- depth4 item4
Ключ: 5 - Значение: --- depth4 item5

В примере выше создана функция, которая запускает цикл foreach, проверяет является ли значение массивом и если это так, то вызывает сама себя рекурсивно, а если значение не массив, то выводит данные на экран, при таком варианте нам не важно, какая вложенность будет у многомерного массива. Пользуйтесь.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *