PHP: Многомерные массивы
Массив не обязательно должен представлять из себя простой список ключей и простых значений. Каждый элемент массива может содержать в качестве значения другой массив, который в свою очередь может тоже содержать массив и так далее. Таким образом можно создавать двумерные и трехмерные массивы.
Двумерные массивы
Двумерный массив - массив, который в качестве значений хранит в себе другие массивы. Рассмотрим создание двумерного массива с помощью конструктора array():
$flowers = array( array("розы", 100 , 15),
array("тюльпаны", 60 , 25),
array("орхидеи", 180 , 7)
);
Массив $flowers содержит три массива. Как вы помните, для доступа к элементам одномерного массива надо указывать имя массива и ключ. То же самое верно и в отношении двумерных массивов, с одним исключением: каждый элемент имеет два ключа: первый для выбора строки, второй для выбора столбца.
Чтобы вывести элементы этого массива можно вручную прописать доступ к каждому из них, но лучше воспользоваться вложенными циклами:
<?php
$flowers = array( array("розы", 100 , 15),
array("тюльпаны", 60 , 25),
array("орхидеи", 180 , 7)
);
echo "<h1>Ручной доступ к элементам</h1>";
echo $flowers[0][0]." цена ".$flowers[0][1]." количество ".$flowers[0][2]."<br>";
echo $flowers[1][0]." цена ".$flowers[1][1]." количество ".$flowers[1][2]."<br>";
echo $flowers[2][0]." цена ".$flowers[2][1]." количество ".$flowers[2][2]."<br>";
echo "<h1>Использование циклов для вывода элементов</h1>";
echo "<ol>";
for ($row = 0; $row < 3; $row++) {
echo "<li><b>Номер строки $row</b>";
echo "<ul>";
for ($col = 0; $col < 3; $col++) {
echo "<li>".$flowers[$row][$col]."</li>";
}
echo "</ul>";
echo "</li>";
}
echo "</ol>";
?>
Вместо номеров столбцов (индексы, присвоенные им по умолчанию) можно задавать им нужные ключи. Для этой цели используются ассоциативные массивы. Следующий массив будет хранить те же данные, но уже с использованием ключей для именования столбцов с информацией:
$flowers = array( array( "Название" => "розы",
"Цена" => 100,
"Количество" => 15
),
array( "Название" => "тюльпаны",
"Цена" => 60,
"Количество" => 25,
),
array( "Название" => "орхидеи",
"Цена" => 180,
"Количество" => 7
)
);
Ключи создают дополнительное удобство для работы с массивом в тех случаях, когда нужно получить одно из значений. Необходимые данные можно легко найти, если обратиться к правильной ячейке, используя значимые имена строки и столбца. Однако при этом мы теряем возможность последовательно обхода массива с помощью цикла for.
Мы можем перебрать с помощью цикла for только дочерние массивы. Так как они, в свою очередь, являются ассоциативными, то для перебора их элементов нужно воспользоваться циклом foreach, или перебрать элементы вручную:
<?php
$flowers = array( array( "Название" => "розы",
"Цена" => 100,
"Количество" => 15
),
array( "Название" => "тюльпаны",
"Цена" => 60,
"Количество" => 25,
),
array( "Название" => "орхидеи",
"Цена" => 180,
"Количество" => 7
)
);
echo "<h1>Ручной доступ к элементам ассоциативного массива</h1>";
for ($row = 0; $row < 3; $row++) {
echo $flowers[$row]["Название"]." цена ".$flowers[$row]["Цена"]
." количество ".$flowers[$row]["Количество"];
echo "<br>";
}
echo "<h1>Использование цикла foreach для доступа к элементам</h1>";
echo "<ol>";
for ($row = 0; $row < 3; $row++) {
echo "<li><b>Номер строки $row</b>";
echo "<ul>";
foreach($flowers[$row] as $key => $value) {
echo "<li>".$value."</li>";
}
echo "</ul>";
echo "</li>";
}
echo "</ol>";
?>
Необязательно использовать для создания двумерного массива конструктор array(), можно воспользоваться и коротким синтаксисом - квадратными скобками:
$flowers = [ [ "Название" => "розы",
"Цена" => 100,
"Количество" => 15
],
[ "Название" => "тюльпаны",
"Цена" => 60,
"Количество" => 25,
],
[ "Название" => "орхидеи",
"Цена" => 180,
"Количество" => 7
]
];
Трёхмерные массивы
Не обязательно ограничиваться только двумя измерениями: так же, как элементы массива могут содержать массивы, эти массивы, в свою очередь, могут содержать новые массивы.
Трёхмерный массив характеризует ширину, высоту и глубину. Если представлять двумерный массив в виде таблицы, то трёхмерный добавляет к этой таблице слои. Каждый элемент такого массива будет ссылаться на слой, строку и столбец.
Если немного модифицировать наш массив с цветами, то можно переделать его в трёхмерный. В коде, представленном ниже видно, что трёхмерный массив - массив, содержащий массив массивов:
$flowers = [ [ ["розы", 100 , 15],
["тюльпаны", 60 , 25],
["орхидеи", 180 , 7]
],
[ ["розы", 100 , 15],
["тюльпаны", 60 , 25],
["орхидеи", 180 , 7],
],
[ ["розы", 100 , 15],
["тюльпаны", 60 , 25],
["орхидеи", 180 , 7]
]
];
Поскольку этот массив содержит только числовые индексы, мы можем использовать для его отображения вложенные циклы:
<?php
$flowers = [ [ ["розы", 100 , 15],
["тюльпаны", 60 , 25],
["орхидеи", 180 , 7]
],
[ ["розы", 100 , 15],
["тюльпаны", 60 , 25],
["орхидеи", 180 , 7],
],
[ ["розы", 100 , 15],
["тюльпаны", 60 , 25],
["орхидеи", 180 , 7]
]
];
echo "<ul>";
for ( $layer = 0; $layer < 3; $layer++ )
{
echo "<li>Номер слоя $layer";
echo "<ul>";
for ( $row = 0; $row < 3; $row++ )
{
echo "<li>Номер строки $row";
echo "<ul>";
for ( $col = 0; $col < 3; $col++ )
{
echo "<li>".$flowers[$layer][$row][$col]."</li>";
}
echo "</ul>";
echo "</li>";
}
echo "</ul>";
echo "</li>";
}
echo "</ul>";
?>
С этой темой смотрят: