Массивы ¶
На самом деле массив в PHP — это упорядоченное отображение, которое устанавливает соответствие между значением и ключом. Этот тип оптимизирован в нескольких направлениях, поэтому вы можете использовать его как собственно массив, список (вектор), хеш-таблицу (являющуюся реализацией карты), словарь, коллекцию, стек, очередь и, возможно, что-то ещё. Так как значением массива может быть другой массив PHP, можно также создавать деревья и многомерные массивы.
Объяснение этих структур данных выходит за рамки данного справочного руководства, но вы найдёте как минимум один пример по каждой из них. За дополнительной информацией вы можете обратиться к соответствующей литературе по этой обширной теме.
Синтаксис ¶
Определение при помощи array() ¶
Массив (тип array) может быть создан языковой конструкцией array(). В качестве параметров она принимает любое количество разделённых запятыми пар key => value (ключ => значение).
array(
key => value,
key2 => value2,
key3 => value3,
...
)
Запятая после последнего элемента массива необязательна и может быть опущена. Обычно это делается для однострочных массивов, то есть array(1, 2) предпочтительней array(1, 2, ). Для многострочных массивов с другой стороны обычно используется завершающая запятая, так как позволяет легче добавлять новые элементы в конец массива.
Замечание:
Существует короткий синтаксис массива, который заменяет
array()на[].
Пример #1 Простой массив
<?php
$array = array(
"foo" => "bar",
"bar" => "foo",
);
// Использование синтаксиса короткого массива
$array = [
"foo" => "bar",
"bar" => "foo",
];
?>
key может быть либо типа int, либо типа string. value может быть любого типа.
Дополнительно с ключом key будут сделаны следующие преобразования:
- Строки (string), содержащие целое число (int) (исключая случаи, когда число предваряется знаком
+) будут преобразованы к типу int. Например, ключ со значением"8"будет в действительности сохранён со значением8. С другой стороны, значение"08"не будет преобразовано, так как оно не является корректным десятичным целым. - Числа с плавающей точкой (float) также будут преобразованы к типу int, то есть дробная часть будет отброшена. Например, ключ со значением
8.7будет в действительности сохранён со значением8. - Тип bool также преобразовываются к типу int. Например, ключ со значением
trueбудет сохранён со значением1и ключ со значениемfalseбудет сохранён со значением0. - Тип null будет преобразован к пустой строке. Например, ключ со значением
nullбудет в действительности сохранён со значением"". - Массивы (array) и объекты (object) не могут использоваться в качестве ключей. При подобном использовании будет генерироваться предупреждение:
Недопустимый тип смещения (Illegal offset type).
Если несколько элементов в объявлении массива используют одинаковый ключ, то только последний будет использоваться, а все другие будут перезаписаны.
Пример #2 Пример преобразования типов и перезаписи элементов
<?php
$array = array(
1 => "a",
"1" => "b",
1.5 => "c",
true => "d",
);
var_dump($array);
?>Результат выполнения данного примера:
array(1) {
[1]=>
string(1) "d"
}
Так как все ключи в вышеприведённом примере преобразуются к 1, значение будет перезаписано на каждый новый элемент и останется только последнее присвоенное значение "d".
Массивы в PHP могут содержать ключи типов int и string одновременно, так как PHP не делает различия между индексированными и ассоциативными массивами.
Пример #3 Смешанные ключи типов int и string
<?php
$array = array(
"foo" => "bar",
"bar" => "foo",
100 => -100,
-100 => 100,
);
var_dump($array);
?>Результат выполнения данного примера:
array(4) {
["foo"]=>
string(3) "bar"
["bar"]=>
string(3) "foo"
[100]=>
int(-100)
[-100]=>
int(100)
}
Параметр key является необязательным. Если он не указан, PHP будет использовать предыдущее наибольшее значение ключа типа int, увеличенное на 1.
Пример #4 Индексированные массивы без ключа
<?php
$array = array("foo", "bar", "hallo", "world");
var_dump($array);
?>Результат выполнения данного примера:
array(4) {
[0]=>
string(3) "foo"
[1]=>
string(3) "bar"
[2]=>
string(5) "hallo"
[3]=>
string(5) "world"
}
Возможно указать ключ только для некоторых элементов и пропустить для других:
Пример #5 Ключи для некоторых элементов
<?php
$array = array(
"a",
"b",
6 => "c",
"d",
);
var_dump($array);
?>Результат выполнения данного примера:
array(4) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[6]=>
string(1) "c"
[7]=>
string(1) "d"
}
Как вы видите последнее значение "d" было присвоено ключу 7. Это произошло потому, что самое большое значение ключа целого типа перед этим было 6.
Пример #6 Расширенный пример преобразования типов и перезаписи элементов
<?php
$array = array(
1 => 'a',
'1' => 'b', // значение "b" перезапишет значение "a"
1.5 => 'c', // значение "c" перезапишет значение "b"
-1 => 'd',
'01' => 'e', // поскольку это не целочисленная строка, она НЕ перезапишет ключ для 1
'1.5' => 'f', // поскольку это не целочисленная строка, она НЕ перезапишет ключ для 1
true => 'g', // значение "g" перезапишет значение "c"
false => 'h',
'' => 'i',
null => 'j', // значение "j" перезапишет значение "i"
'k', // значение "k" присваивается ключу 2. Потому что самый большой целочисленный ключ до этого был 1
2 => 'l', // значение "l" перезапишет значение "k"
);
var_dump($array);
?>