Массивы
Массивы
Массив в PHP это упорядоченная карта. Карта/map это тип, который отображает значения в ключи. Этот тип оптимизируется разными способами, поэтому вы можете использовать его как реальный массив или список (вектор), хэш-таблицу (которая является реализацией карты), словарь/dictionary, коллекцию/collection, стэк/stack, очередь/queue и, возможно, что-то ещё. Поскольку вы можете иметь другой PHP-массив в качестве значения, вы можете также довольно легко симулировать деревья/trees.
Объяснение этих структур выходит за рамки данного учебника, но вы можете найти как минимум по одному примеру для каждой этой структуры. За дополнительной информацией об этих структурах мы отсылаем вас к литературе по этой обширной теме.
Синтаксис
Специфицирование с помощью array()
Массив может быть создан конструкцией языка array(). Она принимает определённое количество разделённых запятыми пар key => value (ключ-значение).
key это либо integer, либо string. Если ключ это стандартное представление integer, он будет интерпретироваться как таковой (т.е. "8" будет интерпретироваться как 8, а "08" будет интерпретироваться как "08").
Значение может быть любым.
Если вы опускаете ключ, берётся максимальный целочисленный индекс, а новый key будет равен этому максимуму + 1. Поскольку целые числа могут быть отрицательными, это верно также и в отношении отрицательных индексов. Если, например наивысший индекс -6, это даст в результате для нового ключа -5. Если ещё нет ни одного целочисленного индекса, key будет 0 (нуль). Если вы специфицируете ключ, который уже имеет присвоенное значение, это значение будет перезаписано.
Использование true в качестве ключа будет вычисляться в integer 1 в качестве ключа. Использование false в качестве ключа будет вычисляться в integer 0 в качестве ключа. Использование NULL в качестве ключа будет вычисляться в пустую строку. Использование пустой строки в качестве ключа создаст (или перезапишет) ключ пустой строкой в качестве значения, это не то же самое, что использование пустых угловых скобок.
Вы не можете использовать массивы с объектами в качестве ключей. Если это сделать, появится предупреждение: Illegal offset type.
array( [key =>] value , ... ) // key это либо string, либо неотрицательное integer // value\значение может быть любым |
Создание/модифицирование с помощью синтаксиса квадратных (угловых) скобок
Вы также можете модифицировать существующий массив, явно установив значения.
Это делается путём присвоения значений массиву через специфицирование key в квадратных скобках. Вы можете также опустить key, добавив пустую пару угловых скобок ("[]") паре имя-значение.
$arr[key] = value; $arr[] = value; // key это либо string, либо неотрицательное integer // value может быть любым |
Если массив $arr ещё не существует, он будет создан. Итак, это альтернативный способ специфицирования массива. Для изменения конкретного значения просто присвойте ему новое значение. Если вы хотите удалить пару key/value, вы должны её unset().
Используемые функции
Имеется достаточное количество функций для работы с массивами, см. раздел Функции массивов.
Примечание: функция unset() позволяет отменить установку ключа массива. Не забудьте, что при этом массив НЕ реиндексируется.
$a = array( 1 => 'one', 2 => 'two', 3 => 'three' ); unset( $a[2] ); /* даст массив, который определён как $a = array( 1=>'one', 3=>'three'); а НЕ как $a = array( 1 => 'one', 2 => 'three'); */
Структура управления foreach существует специально для массивов. Она даёт возможность без усилий просматривать массив.
Массив может и не может
Почему $foo[bar] неправильно?
Вы всегда должны использовать кавычки вокруг индекса ассоциативного массива. Например, пишите $foo['bar'], а не $foo[bar]. Но почему не верна запись $foo[bar]? Вы могли встретить в старых скриптах такой синтаксис:
$foo[bar] = 'enemy'; echo $foo[bar]; // etc |
Это неправильно, но работает. Тогда почему неправильно? Суть в том, что этот код содержит неопределённую константу (bar), а не строку 'bar' (обратите внимание на кавычки), и PHP может в дальнейшем определить константу, которая, к несчастью для вашего кода, имеет то же самое имя. Это работает, поскольку неопределённая константа конвертируется в строку с тем же именем.
Как указано в разделе синтаксис, между квадратными скобками ('[' и ']') должно иметься выражение. Это означает, что вы можете записать:
echo $arr[ foo(true) ]; |
Это пример использования return-значения функции в качестве индекса массива. PHP знает также и о константах, и вы можете увидеть спереди E_*.
$error_descriptions[E_ERROR] = "A fatal error has occured"; $error_descriptions[E_WARNING] = "PHP issued a warning"; $error_descriptions[E_NOTICE] = "This is just an informal notice"; |
Обратите внимание, что E_ERROR это такой же идентификатор, как и bar в первом примере. Но последний пример равносилен записи:
$error_descriptions[1] = "A fatal error has occured"; $error_descriptions[2] = "PHP issued a warning"; $error_descriptions[8] = "This is just an informal notice"; |
поскольку E_ERROR равна 1, etc.
Тогда как может работать $foo[bar]? Это работает, поскольку bar, по причине своего синтаксиса, ожидается как константное выражение. Однако в этом случае константа с именем bar не существует. PHP теперь принимает, что вы обозначили bar литерально как строку "bar", но что вы забыли указать кавычки.
Так почему же это неправильно?
Когда-нибудь в будущем команда PHP может добавить другую константу или ключевое слово, и у вас появятся проблемы. Например, вы уже не можете использовать слова empty и default таким способом, поскольку они являются теперь зарезервированными ключевыми словами.
Примечание: когда вы переключите error_reporting на E_ALL, вы увидите, что PHP генерирует уведомления, когда используется index, который не определён (поместите строку error_reporting(E_ALL); в ваш скрипт).
Примечание: внутри string, ограниченной двойными кавычками, другой синтаксис является правильным. См. разбор переменных в строках.
Примеры
Тип array в PHP является очень подвижным, поэтому мы даём здесь несколько примеров, демонстрирующих всю мощь массивов.
// это ... $a = array( 'color' => 'red' , 'taste' => 'sweet' , 'shape' => 'round' , 'name' => 'apple' , 4 // key будет 0 ); // ... абсолютно эквивалентно этому $a['color'] = 'red'; $a['taste'] = 'sweet'; $a['shape'] = 'round'; $a['name'] = 'apple'; $a[] = 4; // key будет 0 $b[] = 'a'; $b[] = 'b'; $b[] = 'c'; // даст в результате массив array( 0 => 'a' , 1 => 'b' , 2 => 'c' ), // или просто array('a', 'b', 'c') |
Пример 6-5. Коллекция
|
Заметьте, что в настоящее время нельзя изменять значения массива в таких циклах напрямую.
Но можно сделать так:
Пример 6-6. Коллекция
|
Следующий пример создаёт одномерный массив.
Пример 6-7. Одномерный индекс
|
Пример 6-8. Заполнение реального массива
|
Массивы упорядочены. Вы можете изменять порядок в массиве, используя различные функции сортировки. См. функции массивов.
Пример 6-9. Сортировка массива
|
Поскольку значение массива может быть любым, это может быть также другой массив. Так вы можете создать рекурсивный и многомерный массивы.
Пример 6-10. Рекурсивный и многомерный массивы
|