 |
Массив в 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 в качестве ключа будет вычисляться в
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] = "enemy";
echo $foo[bar];
// etc |
Это неправильно, но работает. Тогда почему неправильно? Суть в том, что
этот код содержит неопределённую константу (bar), а не строку "bar"
(обратите внимание на кавычки), и PHP может в дальнейшем определить константу,
которая, к несчастью для вашего кода, имеет то же самое имя. Это работает,
поскольку неопределённая константа конвертируется в строку с тем же именем.
Как указано в разделе синтаксис,
между квадратными скобками ("[" и "]") должно иметься выражение.
Это означает, что вы можете записать:
Это пример использования 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-4. Использование array()
// Массив как карта (свойств)
$map = array( "version" => 4
, "OS" => "Linux"
, "lang" => "english"
, "short_tags" => true
);
// строго цифровые ключи
$array = array( 7
, 8
, 0
, 156
, -10
);
// это то же самое, что и array( 0 => 7, 1 => 8, ...)
$switching = array( 10 // key = 0
, 5 => 6
, 3 => 7
, "a" => 4
, 11 // key = 6 (максимум целочисленного индекса был 5)
, "8" => 2 // key = 8 (целое число!)
, "02" => 77 // key = "02"
, 0 => 12 // значение 10 будет перезаписано на 12
);
// пустой массив
$empty = array(); |
|
Пример 6-5. Коллекция
$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
)
*/ |
|
Следующий пример создаёт одномерный массив.
Пример 6-7. Одномерный индекс
$firstquarter = array(1 => "January", "February", "March");
print_r($firstquarter);
/* на выходе:
Array
(
[1] => "January"
[2] => "February"
[3] => "March"
)
*/ |
|
Пример 6-8. Заполнение реального массива
// заполним массив всеми элементами директории
$handle = opendir(".");
while ($file = readdir($handle))
{
$files[] = $file;
}
closedir($handle); |
|
Массивы упорядочены. Вы можете изменять порядок в массиве, используя
различные функции сортировки. См. функции массивов.
Пример 6-9. Сортировка массива
sort($files);
print_r($files); |
|
Поскольку значение массива может быть любым, это может быть также другой
массив. Так вы можете создать рекурсивный и многомерный массивы.
Пример 6-10. Рекурсивный и многомерный массивы
$fruits = array ( "fruits" => array ( "a" => "orange"
, "b" => "banana"
, "c" => "apple"
)
, "numbers" => array ( 1
, 2
, 3
, 4
, 5
, 6
)
, "holes" => array ( "first"
, 5 => "second"
, "third"
)
); |
|
|
 |