Значением массива может быть всё, что угодно, в том числе массив. В этом случае синтаксис может выглядеть немного необычно, поэтому разберём его отдельным уроком. Создать массив в массиве можно так:
<?php
$arr1 = [[3]];
count($arr1); // 1
$arr2 = [1, [3, 2], [3, [4]]];
count($arr2); // 3
Каждый элемент, являющийся массивом, рассматривается как единое целое, что видно по размеру второго массива. Вложенность никак не ограничивается. Можно создавать массив массивов массивов и т. д.
Обращение ко вложенным массивам выглядит уже немного необычно, хотя и логично:
<?php
$arr1 = [[3]];
$arr1[0][0]; // 3
$arr2 = [1, [3, 2], [3, [4]]];
$arr2[2][1][0]; // 4
Возможно, с непривычки вы не всегда сразу точно увидите, как добраться до нужного элемента, но это всего лишь вопрос тренировок.
Также можно использовать ассоциативный массив в качестве многомерного массива. Следующий пример демонстрирует создание индексированного массива, который содержит 3 ассоциативных массива:
$movies = array(
array(
"title" => "Rear Window",
"director" => "Alfred Hitchcock",
"year" => 1954
),
array(
"title" => "Full Metal Jacket",
"director" => "Stanley Kubrick",
"year" => 1987
),
array(
"title" => "Mean Streets",
"director" => "Martin Scorsese",
"year" => 1973
)
);
Для получения доступа к элементам многомерного массива можно использовать синтаксис "квадратных скобок", который используется для работы с обычным массивом. Если нужно получить доступ к элементам второго уровня в двумерном массиве нужно просто использовать второй набор квадратных скобок, например:
$myArray = array( array( "один", "два", "три" ), array( "четыре", "пять", "шесть" ) ); // Выводим "шесть" echo $myArray[1][2]; ?>
А вот пример, который демонстрирует доступ к различным элементам многомерного массива $movies, который мы создали раньше:
echo "Название первого фильма:<br />"; echo $movies[0]["title"] . "<br /><br />"; echo "Режисер третьего фильма:<br />"; echo $movies[2]["director"] . "<br /><br />"; echo "Вложенный массив, который содержится в первом элементе:<br />"; print_r( $movies[0] ); echo "<br /><br />";
Выполнение кода:
Название первого фильма: Rear Window Режисер третьего фильма: Martin Scorsese Вложенный массив, который содержится в первом элементе: Array ( [title] => Rear Window [director] => Alfred Hitchcock [year] => 1954 )
Последний пример использует $movies[0] для организации доступа ко всему вложенному массиву в первом элементе массива верхнего уровня, а затем используется функция print_r() для вывода содержимого массива.
Так же, как и для обычного одномерного массива можно использовать foreach для организации перебора всех элементов многомерного массива. Нужно создать вложенный цикл foreach, то есть один цикл внутри другого:
В примере создаётся 2-у мерный массив с информацией по фильмам, а затем организуется цикл по элементам массива для вывода информации на страницу:
$movies = array(
array(
"title" => "Rear Window",
"director" => "Alfred Hitchcock",
"year" => 1954
),
array(
"title" => "Full Metal Jacket",
"director" => "Stanley Kubrick",
"year" => 1987
),
array(
"title" => "Mean Streets",
"director" => "Martin Scorsese",
"year" => 1973
)
);
foreach ( $movies as $movie ) {
echo '<dl style="margin-bottom: 1em;">';
foreach ( $movie as $key => $value ) {
echo "<dt>$key</dt><dd>$value</dd>";
}
echo '</dl>';
}
Выполнение данного кода:
title
Rear Window
director
Alfred Hitchcock
year
1954
title
Full Metal Jacket
director
Stanley Kubrick
year
1987
title
Mean Streets
director
Martin Scorsese
year
1973
Во многих языках программирования есть очень полезная функция flatten. В определённых задачах она сильно упрощает
жизнь и сокращает количество кода. flatten принимает на вход массив и выправляет его: если элементами массива
являются массивы, то flatten сводит все к одному массиву, раскрывая каждый вложенный.
Посмотрим на пример:
<?php
flatten([[3, 2], 5, 3, [3, [4, 2]], 10]);
// [3, 2, 5, 3, 3, 4, 2, 10]