Массив не обязательно должен быть простым списком ключей и значений — каждая ячейка массива может содержать другой массив. Таким образом, допускается создание двумерных массивов. Двумерный массив можно предмтавить себе в виде матрицы, или таблицы, обладающей шириной и высотой, иначе говоря строками и столбцами.
На рисунке товары, поставляемые компанией АВС, представлены в виде двумерного массива, каждая строка которого представляет отдельный вид товара, а каждый столбец — атрибут хранящегося товара.
Для записи данных в массив, представленный на рисунке, может послужить следующий код:
$products = array (array ('OLL', 'Фильтры масляные', 20),
array ('AIR', 'Фильтры воздушные', 10),
array ('SPK', 'Свечи зажигания', 4));
Из этого определения видно, что теперь массив $products содержит три массива.
Для доступа к данным в одномерном массиве необходимо знать имя массива и индекс элемента. Тоже справедливо и для двумерного массива, за исключением того, что каждый элемент имеет два индекса — строку и столбец. Верхняя строка является строкой с номером 0, а крайний слева столбец — столбцом с номером 0.
Для отображения содержимого этого массива можно было бы вручную осуществить доступ к каждому из элементов массива в следующем порядке:
echo '|'.$products [0][0].'|'.$products [0][1]. '|'.$products [0][2].'<br>';
echo '|'.$products [1][0].'|'.$products [1][1]. '|'.$products [1][2].'<br>';
echo '|'.$products [2][0].'|'.$products [2][1]. '|'.$products [2][2].'<br>';
В окне веб-браузера это будет выглядеть ТАК.
С другой стороны, для получения тех же результатов можно поместить цикл for внутрь другого цикла for.
$products = array (array ('OLL', 'Фильтры масляные', 20),
array ('AIR', 'Фильтры воздушные', 10),
array ('SPK', 'Свечи зажигания', 4));
for ($row = 0; $row < 3; $row ++)
{
for ($column = 0; $column < 3; $column ++)
{
echo '|' .$products[$row][$column];
}
echo '| <br>';
}
В окне веб-браузера это будет выглядеть ТАК.
Как видите обе версии создают одинаковый вывод.
Единственное различие между двумя приведенными примерами состоит в том, что при использовании второй версии применительно к крупному массиву код будет намного короче.
Если, вместо номеров столбцов создать их имена, как показано на рисунке, то для сохранения этого же набора товаров, можно применить следующий код:
$products = array (array ('Code' => 'OLL',
'Description' => 'Фильтры масляные',
'Price' => 20
),
array ('Code' => 'AIR',
'Description' => 'Фильтры воздушные',
'Price' => 10
),
array ('Code' => 'SPK',
'Description' => 'Свечи зажигания',
'Price' => 4
)
);
C этим массивом работать проще, если требуется извлечь из него единственное значение. Проще запомнить, что описание хранится в столбце Dtscription (Описание), нежели оно хранится в столбце с номером 1. При использовании описательных индексов не приходится запоминать, что элемент хранится в ячейке [a] [b]. Данные можно легко найти, обратившись к ячейке с содержательными именами строки и столбца, которые несут определенную смысловую нагрузку.
Однако при этом теряется возможность применения простого цикла for для последовательного просмотра всех столбцов. Ниже приведен один из вариантов кода для отображения этого массива:
for ($row = 0; $row < 3; $row ++)
{
echo '|'.$products [$row]['Code'].'|'.$products [$row]['Description'].'|'.$products [$row]['Price']. '|<br>';
}
В окне веб-браузера это будет выглядеть ТАК.
С помощью цикла for можно просмотреть внешний численно-индексированный массив $products. Каждая строка массива $products представляет собой массив с описательными индексами. Используя функции each () и list () в цикле while, можно просмотреть внутренние массивы. Следовательно, внутри цикла for требуется цикл while.
for ($row = 0; $row < 3; $row ++)
{
while (list ($key, $value) = each ($products [$row]))
{
echo "|$value";
}
echo '|<br>';
}
В окне веб-браузера это будет выглядеть ТАК.
Как видите ничего не изменилось.
Не обязательно ограничиваться двумя измерениями — так же, как элементы массива могут содержать другие массивы, эти массивы, в свою очередь, могут содержать дополнительные массивы.
Трехмерный массив характеризуется высотой, шириной и глубиной. Если вам удобно представлять двумерный массив в виде таблицы, имеющей строки и столбцы, представьте себе стопку таких таблиц. Ссылка на каждый элемент такого массива будет осуществляться по его слою, строке и столбцу.
На рисунке показаны данные о товарах, поставляемые компанией АВС, в виде трехмерного массива.
В коде, представляющим этот массив, видно, что трехмерный массив представляет собой массив массивов:
$categories = array (array (array ('CAR_OLL', 'Фильтры масляные', 20),
array ('CAR_AIR', 'Фильтры воздушные', 10),
array ('CAR_SPK', 'Свечи зажигания', 4)),
array (array ('VAN_OLL', 'Фильтры масляные', 20),
array ('VAN_AIR', 'Фильтры воздушные', 10),
array ('VAN_SPK', 'Свечи зажигания', 4)),
array (array ('TRK_OLL', 'Фильтры масляные', 20),
array ('TRK_AIR', 'Фильтры воздушные', 10),
array ('TRK_SPK', 'Свечи зажигания', 4)),
);
Поскольку этот массив имеет только числовые индексы, для отображения его содержимого можно воспользоваться вложенными циклами for.
for ($layer = 0; $layer < 3; $layer ++)
{
echo "Слой $layer<br>";
for ($row = 0; $row < 3; $row ++)
{
for ($column = 0; $column < 3; $column ++)
{
echo '|'.$categories [$layer][$row][$column];
}
echo '|<br>';
}
}
В окне веб-браузера это будет выглядеть ТАК.
Этот способ создания многомерных массивов позволяет получить четырех-, пяти- или шестимерные массивы. Синтаксис языка не налагает никаких ограничений на количество измерений, однако трудно представить конструкции, содержащие более трех измерений. Большинство практических задач логически соответствует конструкциям с тремя и меньшим числом измерений.