Четверг, 16.05.2024, 11:29
DigitalBox
Приветствую Вас Гость | RSS
Главная Многомерные массивы Регистрация Вход
Меню сайта

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



В предыдущих разделах речь шла об одномерных списках пар ключ-значение. Однако в некоторых случаях необходимо сохранять данные с несколькими ключами. Пусть, например, имеется информация о ценах на некоторые продукты:

  • лук (onion) — 0,50;
  • яблоко (apple) — 2,50;
  • апельсин (orange) — 2,00;
  • бекон (bacon) — 3,50;
  • картофель (potato) — 1,00;
  • ветчина (ham) — 5,00.

Ее можно сохранить в одномерном массиве следующим образом:

$foodPrices['onion'] = 0.50;
$foodPrices['apple'] = 2.50;
$foodPrices['orange'3 = 2.00;
$foodPrices['bacon'] =3.50;
$foodPrices['potato'] = 1.00;
$foodPrices['ham'] = 5.00;

Тогда в любой момент можно просмотреть информацию о ценах на продукты путем прямого доступа к элементам массива $foodPrices. Но представим, что список товаров содержит 3000 наименований. В этом случае необходимо будет просмотреть 3000 элементов массива, чтобы найти информацию о конкретном продукте, например о луке(onion) или ветчине(ham).

Однако список товаров можно разделить на три группы: овощи(vegetable), фрукты(fiuit) и мясные изделия(meat). И тогда необходимо будет просматривать информацию о продуктах только в рамках одной категории, а не весь список, что является более эффективным. Это можно осуществить, используя многомерные массивы:

$foodPrices['vegetable']['onion'] = 0.50;
$foodPrices ['vegetable']['potato'] = 1.00;
$foodPrices['fruit']['apple'] = 2.50;
$foodPrices['fruit']['orange'] = 2.00;
$foodPrices['meat']['bacon'] = 3.50;
$foodPrices['meat']['ham'] = 5.00;

Такой массив называется многомерным (multidimensional), поскольку представляет собой массив массивов. В таблице ниже показана структура массива $foodPrices. В таблице видно, что массив $foodPrices содержит три пары ключ-значение. При этом значение каждого элемента с ключами vegetable, fruit и meat — массив с двумя элементами. Например, элемент с ключом meat — это массив с двумя парами ключ-значение: bacon-3.50 и ham-5.00.

$foodPricesключзначение

vegetable

fruit

meat

ключ        значение
onion        0,50
potato       1,00
orange      2,00
apple        2,50
bacon        3,50
ham          5,00

Массив $foodPrices является двумерным. Язык РНР также позволяет работать с четырех-, пяти-, шестимерными или массивами большей размерности. Однако их использование может внести большую путаницу в код сценария.


Создание многомерных массивов

РНР позволяет создавать многомерные массивы точно так же, как и одномерные. Например, можно воспользоваться прямым присваиванием значений элементам массива:

$foodPrices['vegetable']['potato'] = 1.00;
$foodPrices['fruit']['apple'] = 2.50;

Можно также воспользоваться сокращенной записью:

transportation['car'][] = "Форд";
transportation['car'][] = "Джип";

По умолчанию в качестве индексов будут использоваться целые числа, начиная с 0:

transportation[car][0] = Форд;
transportation[саг][1] = Джип;

Создать многомерный массив можно с помощью выражения array:

$foodPrices = array(
        "vegetable" => array("potato" =>1.00, "onion" => .50),
        "fruit" => array("apple" => 2.50, "orange" => 2.00));

Следует заметить, что массив $foodPrices с индексами vegetable и fruit создается с помощью первого вызова функции array. Его элементы также представляют собой массивы, что приводит к созданию массива массивов. В результате получим следующий многомерный массив:

$foodPrices[vegetable][potato] = 1.00
$foodPrices[vegetable][onion] = .50
$foodPrices[fruit][apple] = 2.50
$foodPrices[fruit][orange] = 2.00


Вывод многомерных массивов

Для вывода информации о многомерном массиве можно воспользоваться теми же функциями, что и для одномерного, — print_r() или var_dump(). Рассмотрим следующий пример:

array(2) {
         ["vegetable"] =>
         array(2){
                  ["potato"] =>
                  float(1)
                  ["onion"] =>
                  float(0.5)
          }
          ["fruit"] =>
          array(2){
                   ["apple"] =>
                   float(2.5)
                   ["orange"] =>
                   float(2)
          }
}

Первая строка указывает на массив, содержащий два элемента. Его первый элемент с индексом vegetable — массив с двумя элементами типа float с индексами potato и onion и значениями 1 и 0.5 соответственно. Второй элемент основного массива с индексом fruit также состоит из двух элементов.


Использование многомерных массивов в выражениях

Для получение значений элементов многомерного массива используются те же процедуры, что и для одномерного. Рассмотрим пример, в котором доступ к элементам осуществляется напрямую:

$hamPrice = $foodPrices['meat']['ham'];

Для вывода значений можно использовать функцию echo:

echo $foodPrices['meat']['ham'];

Если же значение элемента необходимо вывести в выражении с двойными кавычками, имя массива следует заключить в фигурные скобки. При этом символ $(начало имени переменной) должен следовать сразу же за открывающей фигурной скобкой без пробелов:

echo "Ветчина стоит \${$foodPrices['meat']['ham']}";

Заметим, что перед первым символом $ стоит символ \. Он используется для того, чтобы РНР интерпретировал $ не как символ начала имени переменной, а буквально. В результате будет выведено:

Ветчина стоит $5

Ранее в этом разделе приводилось описание различных функций для преобразования текстовых строк в массивы (и наоборот), массивов в отдельные переменные и осуществления других операций. Многие из этих операций не имеет смысла использовать для многомерных массивов, так как они будут работать некорректно. Однако это можно осуществить для отдельных элементов, которые сами по себе являются массивами. Рассмотрим, например, функцию implode(), которая преобразует массив в текстовую строку. Ее нельзя напрямую использовать для многомерного массива, поскольку его значения— массивы. Но, как уже упоминалось, эту операцию можно выполнить для отдельных элементов:

$resString = implode(":", $foodPrices['vegetable']);

Это выражение преобразует элементы массива $foodPrices['vegetable'] в строку, в которой в качестве символа-разделителя используется двоеточие и пробел ": ". Если результат выполнения функции implode() вывести на экран, получим следующее:

1: 0.5

Будут выведены значения элементов 1 и 0.5 массива $foodPrices['vegetable'] с индексами potato и onion соответственно, разделенные двоеточием и пробелом, как указано в функции implode().


Проход по многомерному массиву

Проход по многомерному массиву можно осуществить с помощью функции foreach. Поскольку двумерный массив, такой как $foodPrices, содержит в качестве элементов два массива, для прохода необходимо дважды использовать оператор foreach: один внутри другого. (Использование оператора внутри другого называется вложением (nesting).)

Нижеприведенный фрагмент кода позволяет вывести значения элементов многомерюго массива:

foreach ($foodPrices as $category )
{
     foreach ($category as $food =>$price )
     {
          $f_price =sprintf("%01.2f",$price);
          echo "$food: \$$f_price \n";
     }
}

В результате получим:

onion: $0.50
potato: $1.00
apple: $2.50
orange: $2.00
bacon: $3.50
ham: $5.00

Рассмотрим поэтапно, как интерпретируется использование выражения foreach.

  1. Обрабатывается первая пара индекс-значение массива $foodPrices, и значение элемента записывается в переменную $category(которая сама по себе является массивом).
  2. Обрабатывается первый элемент массива $category: его индекс сохраняется в переменной $food, а значение — в $price.
  3. Значение переменной $price преобразуется в денежный формат.
  4. Выводятся в одну строку наименование продукта и его цена.
  5. Обрабатывается следующий элемент массива $category.
  6. Формат переменной $price преобразуется в денежный, и выводится последующая строка с наименованием продукта и его цены.
  7. По достижении конца массива $category заканчивается внутренний цикл выражения foreach.
  8. Обрабатывается следующий элемент массива $foodPrices во внешнем цикле foreach, в котором значение присваивается переменной $category.
  9. Шаги 1-8 повторяются до тех пор, пока не будет достигнут конец массива $category. Таким образом, будут завершены внутренние и внешние циклы выражения foreach.

Другими словами, внешний цикл foreach начинается с первого элемента с индексом vegetable и значением-массивом, которое присваивается переменной $category. В свою очередь, внутренний цикл foreach предназначен для прохода по всем элементам массива $category и заканчивается по достижении последнего элемента. Затем осуществляется переход во внешний цикл foreach, где обрабатывается вторая пара индекс-значение массива $foodPrices, и т.д. до конца.

Форма входа

Мини-чат

Календарь новостей
«  Май 2024  »
ПнВтСрЧтПтСбВс
  12345
6789101112
13141516171819
20212223242526
2728293031

Поиск

Друзья сайта
Скажи сайту спасибо
ЯндексЯндекс. ДеньгиХочу такую же кнопку



Получить WMR-бонус на свой кошелек!

Статистика

Онлайн всего: 2
Гостей: 2
Пользователей: 0

Copyright MyCorp © 2024 Бесплатный конструктор сайтов - uCoz