#3.16 php Многомерные массивы
Primary tabs
До сих пор рассматривались только одномерные массивы. Но в РНР имеется возможность работы и с многомерными массивами. Пусть для хранения экзаменационных оценок используется одномерный массив $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>
Результат выполнения примера:
- Log in to post comments
- 342 reads