Массив в PHP это упорядоченная карта. Карта/map это тип, который отображает значения в ключи.
Этот тип оптимизируется разными способами,
поэтому вы можете использовать его как реальный массив или список (вектор),
хэш-таблицу (которая является реализацией карты), словарь/dictionary, коллекцию/collection,
стэк/stack, очередь/queue и, возможно, что-то ещё. Поскольку вы можете иметь другой
PHP-массив в качестве значения, вы можете также довольно легко симулировать деревья/trees.
Объяснение этих структур выходит за рамки данного учебника,
но вы можете найти как минимум по одному примеру для каждой этой структуры.
За дополнительной информацией об этих структурах мы отсылаем вас к литературе по этой обширной теме.
Массив может быть создан конструкцией языка array().
Она принимает определённое количество разделённых запятыми пар key => value (ключ-значение).
key это либо integer, либо
string. Если ключ это стандартное представление
integer, он будет интерпретироваться как таковой (т.е.
"8" будет интерпретироваться как 8, а "08" будет интерпретироваться как
"08").
Значение может быть любым.
Если вы опускаете ключ, берётся максимальный целочисленный индекс, а
новый key будет равен этому максимуму + 1. Поскольку целые числа могут быть отрицательными,
это верно также и в отношении отрицательных индексов. Если, например наивысший индекс
-6, это даст в результате для нового ключа -5. Если ещё нет ни одного
целочисленного индекса, key будет 0 (нуль). Если вы специфицируете ключ, который
уже имеет присвоенное значение, это значение будет перезаписано.
Использование true в качестве ключа будет вычисляться в
integer1 в качестве ключа. Использование
false в качестве ключа будет вычисляться в integer0 в качестве ключа. Использование 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().
Вы всегда должны использовать кавычки вокруг индекса ассоциативного массива.
Например, пишите $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); в ваш скрипт).
$colors = array(’red’,’blue’,’green’,’yellow’);
foreach ( $colors as $color ) {
echo "Do you like $color?
";
}
/* на выходе:
Do you like red?
Do you like blue?
Do you like green?
Do you like yellow?
*/
Заметьте, что в настоящее время нельзя изменять значения массива в таких циклах напрямую.
Но можно сделать так:
Пример 6-6. Коллекция
foreach ($colors as $key => $color) {
// не будет работать:
//$color = strtoupper($color);
//работает:
$colors[$key] = strtoupper($color);
}
print_r($colors);
/* на выходе:
Array
(
[0] => RED
[1] => BLUE
[2] => GREEN
[3] => YELLOW
)
*/