Многие вещи, которые делают мир таким, каким мы его знаем, настолько распространены, что мы забываем, что они вообще существуют. Один из моих любимых примеров — лифт; Идея подъемной платформы или ящика очень старая, но ей пришлось ждать, пока промышленная революция станет практичным устройством. Когда г-н Отис установил свой первый успешный лифт в совершенно новом здании EV Haughwout Building в 1857 году, он открыл путь для вертикального роста мегаполисов, таких как Нью-Йорк и Сан-Паулу.
Еще одно мое любимое изобретение — столы. Не в столовой, хотя они также очень важны как для еды, так и для работы, а скорее для хранения информации. Такие таблицы являются частью нашей повседневной жизни в сотнях разных вариаций. Во многих странах на контейнерах с молоком, маслом и хлопьями представлена таблица питательной ценности, хотя мне интересно, кто их читает и понимает. Большинство бумаг, для тех, кто все еще читает их в печатном виде, организованы как своего рода стол. Многие города, особенно в Новом Свете (далее сюда входят Австралия и Новая Зеландия), организованы в виде таблицы с улицами в виде рядов и проспектов в виде столбцов. Дети начинают с таблиц, как только начинают учиться умножению и делению; на самом деле, в португальском языке есть интересное слово для таблиц умножения: табоада , грубо говоря, «вещь, поставленная на стол!». Инженерия немыслима без таблиц, а таблицы являются основой методов управления, таких как исследование операций и теория игр .
Но как насчет предмета этой статьи, массивы ?
Что такое массивы?
Таблицы организуют данные таким образом, чтобы мы могли легко находить корреляции или выполнять простые вычисления. Массив — это, по сути, способ организации данных в виде таблицы. Название «массив» происходит от тех же латинских корней, что и слово «аранжировка».
Чтобы помочь нам лучше понять массивы, давайте начнем с таблицы « Цены Нью-Йорка», в которой указана стоимость гамбургера в Нью-Йорке, составляющая один доллар:
Мы можем записать его в виде массива, который, как вы уже не догадаетесь, pricesNYC
ЦеныNYC ("Гамбургер" = 1)
Эта информация настолько проста, что ее представление на столе или в массиве кажется пустой тратой времени. Но что, если мы добавим цену на картофель фри? Мы могли бы написать:
и:
PricesNYC ("гамбургер" = 1, "картофель фри" =. 70)
Это ассоциативный массив . В ассоциативном массиве каждое значение идентифицируется меткой или последовательностью меток, называемой ключом . ключи гамбургера и картофеля фри в этом примере, и их значения 1 и 0,70 соответственно. Ключи также могут быть числовой последовательностью вместо меток. В таких случаях массив называется неассоциативным . Наш пример в качестве неассоциативного массива будет:
Цены NYC (0 = 1, 1 = .70)
Значение индекса (или ключа) 0 равно 1, а значение индекса 1 равно 0,70. (В большинстве языков программирования неассоциативные массивы начинаются с индекса 0 по большей части историческим и математически удобным причинам.)
Иногда индексы не указываются явно, но значения по-прежнему доступны по их позиции.
Цены NYC (1, 0,70)
Придерживаясь ассоциативного массива, мы могли бы создать вторую таблицу и массив, если хотим показать те же цены для Лос-Анджелеса:
Цены LA ("гамбургер" = 1,30, "картофель фри" =. 50)
В качестве альтернативы, мы могли бы объединить данные из двух таблиц вместе, как это:
цены ("Нью-Йорк" = ценыNYC ("гамбургер" = 1, "картофель фри" =. 70), "Лос-Анджелес" = цены LA ("гамбургер" = 1,30, "картофель фри" =. 50))
Мы начали создавать массивы внутри массивов, и теперь каждое значение идентифицируется последовательностью меток. Например, ключ к цене бургера в Нью-Йорке теперь Нью-Йорк , гамбургер . В prices
Нью-Йорк и Лос-Анджелес . Каждый из этих ключей указывает на значения, которые на самом деле являются другими массивами. Эти массивы второго уровня имеют метки гамбургер и картофель фри, которые, наконец, указывают на число, которое является желаемой ценой.
Неассоциативно, массив будет выглядеть примерно так:
цены (0 = ценыNYC (0 = 1, 1 = .70), 1 = ценыLA (0 = 1,30, 1 = .50))
Цена гамбургера в Нью-Йорке находится здесь с индексом 0 0.
Создание массивов
Теперь, когда концепция массивов установлена, давайте перейдем к обсуждению того, как PHP их реализует и, что более важно, как мы можем их создавать. Наиболее ортодоксальный метод создания массива состоит в использовании конструкции array()
<?php
$pricesNYC = array();
Наш массив как создан пуст. Затем мы можем присвоить значения массиву, используя ключ, указанный в скобках:
<?php
$pricesNYC["hamburger"] = 1;
$pricesNYC["fried"] = .70;
В качестве альтернативы, мы могли бы заполнить массив одновременно с созданием его, используя синтаксический ключ =>
значение . Пары ключ / значение разделяются запятой:
<?php
$pricesNYC = array("hamburger" => 1, "fries" => .70);
Когда я впервые изучал PHP, мне часто приходилось возвращаться к документации, чтобы проверить, был ли правильный оператор =>
->
Однажды я придумал мнемонику «этот ключ будет равен этому значению», и теперь я легко помню, что =>
Так как же выглядят приведенные выше примеры для неассоциативных массивов?
<?php
$pricesNYC = array();
$pricesNYC[0] = 1;
$pricesNYC[1] = .70;
и:
<?php
$pricesNYC = array(0 => 1, 1 => .70);
Если вам нужен только неассоциативный массив, указывать индекс не обязательно. PHP автоматически использует следующее целочисленное значение в последовательности ключей, начиная с 0, для ключа, если вы его не предоставите. Эти примеры создают неассоциативные массивы, идентичные тем, которые мы только что видели:
<?php
$pricesNYC = array();
$pricesNYC[] = 1;
$pricesNYC[] = .70;
и:
<?php
$pricesNYC = array(1, .70);
Массивы PHP могут иметь смешанные ключи, то есть некоторые ключи могут быть строками, а другие могут быть индексами. До сих пор мы видели ключи, которые были либо строками (например, гамбургер ), либо целыми числами (0).
Теперь давайте сделаем вещи немного интереснее, превратив таблицу из двух городов в массив. Создание пустого массива, как и прежде, просто:
<?php
$prices = array();
Также просто, как массив может быть заполнен с помощью синтаксиса скобок:
<?php
$prices["New York"]["hamburger"] = 1;
$prices["New York"]["fries"] = 0.70;
$prices["Los Angeles"]["hamburger"] = 1.30;
$prices["Los Angeles"]["fries"] = 0.50;
или для неассоциативных массивов:
<?php
$prices[1][0]=1;
$prices[1][1]=0.7;
$prices[0][0]=1.3;
$prices[0][1]=0.5;
Как насчет назначения всех значений при создании массива?
Поскольку наша таблица имеет два уровня: первый — город, а второй — элемент, мы объявляем массив как ряд массивов внутри другого:
<?php
$prices = array("Los Angeles" => array("hamburger" => 1.3, "fries" => 0.5),
"New York" => array("hamburger" => 1, "fries" => 0.7));
Вы найдете, что вы часто представляете ключи с переменными, когда работаете с массивами. Это очень полезно для создания массивов, значения которых могут быть вычислены механически. Например, этот цикл создает массив из 10 элементов со значениями, которые являются квадратом ключей:
<?php
$squares = array();
for ($key = 0; $key < 10; $key++) {
$squares[$key] = $key * $key;
}
Полученный массив $squares
<?php
$squares = array();
$squares[0] = 0;
$squares[1] = 1;
$squares[2] = 4;
$squares[3] = 9;
...
$squares[9] = 81;
Использование массивов
Мы узнали, как создавать и заполнять массивы значениями, так как насчет получения этих значений? Чтобы использовать значение в массиве, вам нужно только сослаться на него с именем переменной массива и нужным индексом. Таким образом, цена гамбургера в Нью-Йорке:
<?php
$price = $pricesNYC["hamburger"];
или:
<?php
$price = $prices["New York"]["hamburger"];
Если мы хотим получить стоимость закуски (бургер + картофель фри) в Лос-Анджелесе, мы можем рассчитать ее следующим образом:
<?php
$price = $prices["Los Angeles"]["hamburger"] + $prices["Los Angeles"]["fries"];
Предположим, мы хотим, чтобы список стоимости закусок был во всех городах. Как хорошие программисты, мы не мечтали бы повторить это заявление для всех городов. Скорее, мы бы вместо этого попытались написать цикл. Это хорошая идея, но какую циклическую конструкцию следует использовать? Давайте попробуем for
<?php
for ($key = _start_; $key <= _end_; $key++) {
$price = $prices[$key]["hamburger"] + $prices[$key]["fries"];
}
Хм … это не работает, потому что ключи в массиве являются строками! Мы не знаем, что использовать для _start_
_end_
К счастью, в PHP есть цикл foreach
<?php
foreach ($prices as $snack) {
$price = $snack["hamburger"] + $snack["fries"];
}
Этот цикл будет проходить через массив $prices
При первом запуске он извлечет массив, в котором указаны цены на гамбургеры и картофель фри в Нью-Йорке . Мы называем этот массив $ перекусить . Затем цены добавляются путем поиска значений, используя ключи гамбургер и картофель фри. Конечно, в реальном сценарии с $price
Затем массив первого уровня автоматически увеличивается до следующего элемента, и цикл делает массив второго уровня с ценами для Лос-Анджелеса доступным как $ snack.
Можно вложить foreach
Только для последнего примера, давайте посчитаем цены, используя два цикла. Если это сбивает с толку, скопируйте его ручкой и бумагой (многовековое учебное устройство, которое творит чудеса для просветления) и внимательно прочитайте его.
<?php
foreach ($prices as $city => $snack) {
echo "<b>" . $city . "</b><br>";
foreach ($snack as $item => $price) {
echo $item . " = " . $price . "<br>";
}
}
foreach
=>
Вывод этого цикла отправит в браузер цены на гамбургеры и картофель фри, сгруппированные по городам.
Вывод
Массивы — это очень, очень важная и универсальная структура данных. Они удобны для группировки всех видов связанной информации и действительно просты в использовании, когда вы освоите их. Но вы можете сделать с ними гораздо больше, чем просто добавлять цены. Мне нравится использовать их для настройки сценариев, создания пар ключ / значение для таких данных, как имя домена веб-сайта, описание, ключевые слова, учетные данные для входа в базу данных и т. Д. Также обратите внимание на суперглобальные переменные PHP, такие как $_GET
$_POST
$_SESSION
$_SERVER
Теперь, когда вы на пути к тому, чтобы стать опытным пользователем массива, вы заметите их всех вокруг себя!
Ну и дела, все эти таблицы и массивы сделали меня голодным. Я думаю, что собираюсь спускаться на лифте и есть гамбургер с картошкой фри. Или, скорее, мне нравятся рыба и чипсы?
Изображение через keko64 / Shutterstock