Массивы ¶
На самом деле массив в 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);
?>