Значением массива может быть всё, что угодно, в том числе массив. В этом случае синтаксис может выглядеть немного необычно, поэтому разберём его отдельным уроком. Создать массив в массиве можно так:

<?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, то есть один цикл внутри другого:

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

В примере создаётся 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]