Многомерные массивы

Массив не обязательно должен быть простым списком ключей и значений — каждая ячейка массива может содержать другой массив. Таким образом, допускается создание двумерных массивов. Двумерный массив можно предмтавить себе в виде матрицы, или таблицы, обладающей шириной и высотой, иначе говоря строками и столбцами.

На рисунке товары, поставляемые компанией АВС, представлены в виде двумерного массива, каждая строка которого представляет отдельный вид товара, а каждый столбец — атрибут хранящегося товара.

Двумерный массив с информацией о товарах компании АВС

Для записи данных в массив, представленный на рисунке, может послужить следующий код:

$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>';
}
}

В окне веб-браузера это будет выглядеть ТАК.

Этот способ создания многомерных массивов позволяет получить четырех-, пяти- или шестимерные массивы. Синтаксис языка не налагает никаких ограничений на количество измерений, однако трудно представить конструкции, содержащие более трех измерений. Большинство практических задач логически соответствует конструкциям с тремя и меньшим числом измерений.

назадвверхвперед
Rambler's Top100