#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
- 803 reads