В предыдущих примерах рассматривались только одномерные массивы, где значения элементов представляли числа, строки. Но в PHP массивы могут также быть многомерными, то есть такими, где элемент массива сам является массивом.
Например, создадим многомерный массив с помощью функции array()
:
$families = array(array("Tom", "Alice"), array("Bob", "Kate"));
Сокращенное определение:
$families = [["Tom", "Alice"], ["Bob", "Kate"]];
Выше определенный многомерный массив $families
является двухмерным (частный случай многомерного массива), который можно представить в виде таблицы:
Tom | Alice |
Bob | Kate |
Для элементов данного массива не установлены явным образом ключи, поэтому каждый ключ элемента представляет числовой индекс, которые по умолчанию
начинаются с нуля. Поэтому чтобы обратиться к первому элементу массива, надо использовать индекс 0 - $families[0]
:
$families = [["Tom", "Alice"], ["Bob", "Kate"]]; print_r($families[0]); // Array ( [0] => Tom [1] => Alice )
Но поскольку элементами массива $families являются вложенные массивы, то чтобы обратиться к элементам внутри этих вложенных массивов,
нам необходимо использовать второй индекс - $families[0][0]
:
$families = [["Tom", "Alice"], ["Bob", "Kate"]]; echo $families[0][0] . "<br />"; //Tom echo $families[0][1] . "<br />"; //Alice echo $families[1][0] . "<br />"; //Bob echo $families[1][1]; //Kate
То есть выражение $families[0]
представляет обращение к первому элементу массива $families - к вложенному массиву ["Tom", "Alice"]
,
а выражение $families[0][0]
представляет обращение к первому элементу вложенного массива, то есть, в данном случае к элементу "Tom".
Перебор многомерного массива:
<!DOCTYPE html> <html> <head> <title>METANIT.COM</title> <meta charset="utf-8" /> </head> <body> <table> <?php $families = [["Tom", "Alice"], ["Bob", "Kate"], ["Sam", "Mary"]]; foreach ($families as $family) { echo "<tr>"; foreach ($family as $user) { echo "<td>$user</td>"; } echo "</tr>"; } ?> </table> </body> </html>
Для перебора применяется цикл foreach. Цикл проходит по всем элементам массива $families,
передавая каждый элемент в переменную $family
:
foreach ($families as $family)
Однако каждый элемент массива $families, который передается в переменную $family, сам является массивом. И чтобы получить элементы из вложенного массива, применяется вложенный цикл:
foreach ($family as $user)
В итоге при переборе циклом сформируется таблица:
Также можно определять многомерные ассоциативные массивы:
<!DOCTYPE html> <html> <head> <title>METANIT.COM</title> <meta charset="utf-8" /> </head> <body> <?php $phones = array( "apple"=> array("iPhone 12", "iPhone X", "iPhone 12 Pro") , "samsumg"=>array("Samsung Galaxy S20", "Samsung Galaxy S20 Ultra"), "nokia" => array("Nokia 8.3", "Nokia 3.4")); foreach ($phones as $brand => $items) { echo "<h3>$brand</h3>"; echo "<ul>"; foreach ($items as $key => $value) { echo "<li>$value</li>"; } echo "</ul>"; } ?> </body> </html>
И при выводе мы получим 3 списка:
Чтобы обратиться к элементу данного, также надо указать ключи в квадратных скобках. Например, обратимся к первому элементу в первом массиве. Так как ключ первого массива - "apple", а ключ первого элемента в первом массиве - число 0 (так как мы явным образом не указали ключи):
echo $phones["apple"][0];
Подобным образом можно получить второй элемент третьего массива:
echo $phones["nokia"][1];
Допустим, вложенные массивы также представляют ассоциативные массивы:
<?php $gadgets = array( "phones" => array("apple" => "iPhone 12", "samsumg" => "Samsung S20", "nokia" => "Nokia 8.3"), "tablets" => array("lenovo" => "Lenovo Yoga Smart Tab", "samsung" => "Samsung Galaxy Tab S5", "apple" => "Apple iPad Pro")); foreach ($gadgets as $gadget => $items) { echo "<h3>$gadget</h3>"; echo "<ul>"; foreach ($items as $key => $value) { echo "<li>$key : $value</li>"; } echo "</ul>"; } ?>
Получение и изменение элемента в этом массиве:
// присвоим одному из элементов другое значение $gadgets["phones"]["nokia"] = "Nokia 9"; // выведем это значение echo $gadgets["phones"]["nokia"];
Выше для инициализации массива применялась функция array()
, но также можно использовать и сокращенный вариант с
квадратными скобками:
$gadgets = [ "phones" => ["apple" => "iPhone 12", "samsumg" => "Samsung S20", "nokia" => "Nokia 8.2"], "tablets" => ["lenovo" => "Lenovo Yoga Smart Tab", "samsung" => "Samsung Galaxy Tab S5", "apple" => "Apple iPad Pro"] ];