#3.16 php Многомерные массивы

До сих пор рассматривались только одномерные массивы. Но в РНР имеется возможность работы и с многомерными массивами. Пусть для хранения экзаменационных оценок используется одномерный массив $testscores:

$testscores["Иванов"] = 95;
$testscores["Петров"] = 87;

Но что если надо хранить оценки по нескольким предметам? Для этого удобно использовать двухмерный массив, например:

<?php
$testscores["Иванов"][1] = 95;
$testscores["Иванов"][2] = 85;
$testscores["Петров"][1] = 87;
$testscores["Петров"][2] = 93;
print_r($testscores);
?>

Элемент массива $testscores["Иванов"][1] содержит оценку Иванова по первому предмету, $testscores["Иванов"][2] — по второму предмету и т.д. В результате выполнения данного примера будет выведен созданный многомерный массив:

Array
(
[Иванов] =>Array
(
[1] => 95
[2] => 85
)
[Петров] =>Array
(
)
[1] => 87
[2] => 93
)

Доступ к элементу многомерного массива осуществляется путем указания всех его индексов, например:

echo "Оценка Иванова по первому предмету : ", $testscores["Иванов"][1];

Если требуется заменить элемент массива его значением в строковой константе, ограниченной двойными кавычками, подобно тому, как это делается с обычной переменной, следует заключить элемент массива в фигурные скобки и использовать для строковых индексов одиночные кавычки:

echo "Оценка Иванова по первому предмету :  {$testscores['Иванов'][1]}";

Для создания многомерных массивов можно использовать и сокращенную форму, но следует иметь в виду, что в данном случае нумерация второго индекса начинается с $0$:

<?php
$testscores ["Иванов"] [] =95;
$testscores ["Иванов"] [] =85;
$testscores ["Петров"] [] =87;
$testscores ["Петров"] [] =93;
print_r( $testscores ) ;
?>

В РНР многомерные массивы можно рассматривать как массивы массивов. Например, двухмерный массив можно рассматривать как одномерный массив, элементами которого в свою очередь также являются одномерные массивы. Пример такого описания приведен ниже:

<?php
$test_scores = array("Иванов" => array(95, 85), "Петров" =>
array(87, 93) ) ;
print_r($test_scores);
?>

В результате будет создан следующий массив:

Array
(
[Иванов] => Array
(
[0] =>95
[1] =>85
)
[Петров] => Array
(
[0] =>87
[1] =>93
)
)

Если требуется начать нумерацию второго индекса с 1, используется уже известный синтаксис:

<?php
$testscores = array("Иванов" => array (1 => 95, 85), 
"Петров" => array(1 => 87, 93));
print_r($testscores);
?>

В результате будет создан массив следующего вида:

Array
(
[Иванов] => Array
(
[1]=>95
[2]=>85
)
[Петров] => Array
(
[1]=>87
[2]=>93
)
)

Многомерные массивы и циклы

Часто возникает необходимость перебрать все элементы многомерного массива в цикле. Для этого используются вложенные циклы. Например, для случая двухмерного массива внешний цикл перебирает первый индекс массива, а внутренний цикл перебирает второй индекс. Пример вложенных циклов приведен ниже.

<?php
$testscores [0] [] = 95;
$testscores [0] [] = 85;
$testscores [1] [] = 97;
$testscores [1] [] = 93;
for ($outer_index = 0; $outer_index < count($testscores); $outer_index++)
{
for ($inner_index = 0; $inner_index < count($testscores[$outer_index]); $inner_index++)
{
  echo "\$testscores [$outer_index][$inner_index] = ",
  $testscores[$outer_index][$inner_index] , "<BR>";
}
}
?>

В результате выполнения этого кода будет выведен весь исходный двухмерный массив:

$testscores [0][0] = 95
$testscores [0][1] = 85
$testscores [1][0] = 97
$testscores [1][1] = 93

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

Пример. Вложенный цикл для обхода элементов двухмерного массива

<HTML>
    <HEAD>
        <TITLE>Цикл по всем элементам двухмерного массива</TITLE>
    </HEAD>
    <BODY>
        <H1>Цикл по всем элементам двухмерного массива</H1>    
        <?php
        $testscores ["Иванов"]["первый"] = 95;
        $testscores ["Иванов"]["второй"] = 85;
        $testscores [ "Петров"]["первый"] = 87;
        $testscores ["Петров"]["второй"] = 93;
        foreach ($testscores as $outer_key => $single_array)
        {          
            foreach($single_array as $inner_key => $value)
            {
                echo $testscores[$outer_key][$inner_key], "<BR>";
                echo $value;
            } 
        }
        ?>
    </BODY>
</HTML>

Результат выполнения примера:



Рис. 1. Вложенный цикл для обхода элементов двухмерного массива