Основы
Массив в PHP - это упорядоченное отображение, которое устанавливает соответствие между значением и ключом.
Синтаксис
Определение при помощи array()
Массив (тип array) может быть создан языковой конструкцией array().В качестве параметров она принимает любое количество разделенных запятыми пар key => value (ключ => значение).
array(
key => value,
key2 => value2,
key3 => value3,
...
)
Запятая после последнего элемента массива необязательна и может быть опущена. Обычно это делается для однострочных массивов, т.е. array(1, 2) предпочтительней array(1, 2, ). Для многострочных массивов с другой стороны обычно используется завершающая запятая, так как позволяет легче добавлять новые элементы в конец массива.
Начиная с PHP 5.4 возможно использовать короткий синтаксис определения массивов, который заменяет языковую конструкцию array() на [].
<?php
$array = array(
"foo" => "bar",
"bar" => "foo",
);
// Начиная с PHP 5.4
$array = [
"foo" => "bar",
"bar" => "foo",
];
?>
key может быть либо типа integer, либо типа string. value может быть любого типа. Дополнительно с ключом key будут сделаны следующие преобразования:
- Строки, содержащие целое число будут преобразованы к типу integer. Например, ключ со значением "8" будет в действительности сохранен со значением 8. С другой стороны, значение "08" не будет преобразовано, так как оно не является корректным десятичным целым.
- Числа с плавающей точкой (тип float) также будут преобразованы к типу integer, т.е. дробная часть будет отброшена. Например, ключ со значением 8.7 будет в действительности сохранен со значением 8.
- Тип bool также преобразовываются к типу integer. Например, ключ со значением TRUE будет сохранен со значением 1 и ключ со значением FALSE будет сохранен со значением 0.
- Тип NULL будет преобразован к пустой строке. Например, ключ со значением NULL будет в действительности сохранен со значением "".
- Массивы (тип array) и объекты (тип object) не могут использоваться в качестве ключей. При подобном использовании будет генерироваться предупреждение: Недопустимый тип смещения (Illegal offset type).
Если несколько элементов в объявлении массива используют одинаковый ключ, то только последний будет использоваться, а все другие будут перезаписаны.
<?php
$array = array(
1 => "a",
"1" => "b",
1.5 => "c",
true => "d",
);
var_dump($array);
/*
array(1) {
[1]=>
string(1) "d"
}
*/
?>
Так как все ключи в вышеприведенном примере преобразуются к 1, значение будет перезаписано на каждый новый элемент и останется только последнее присвоенное значение "d".
Массивы в PHP могут содержать ключи типов integer и string одновременно, так как PHP не делает различия между индексированными и ассоциативными массивами.
<?php
$array = array(
"foo" => "bar",
"bar" => "foo",
100 => -100,
-100 => 100,
);
var_dump($array);
/*
array(4) {
[0]=>
string(3) "foo"
[1]=>
string(3) "bar"
[2]=>
string(5) "hello"
[3]=>
string(5) "world"
}
*/
?>
Возможно указать ключ только для некоторых элементов и пропустить для других:
<?php
$array = array(
"a",
"b",
6 => "c",
"d",
);
/*
array(4) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[6]=>
string(1) "c"
[7]=>
string(1) "d"
}
*/
var_dump($array);
?>
Как вы видите последнее значение "d" было присвоено ключу 7. Это произошло потому, что самое большое значение ключа целого типа перед этим было 6.
Доступ к элементам массива с помощью квадратных скобок
Доступ к элементам массива может быть осуществлен с помощью синтаксиса array[key].
Замечание: Для доступа к элементам массива могут использоваться как квадратные, так и фигурные скобки (например, $array[42] и $array{42} означают одно и то же.
С PHP 5.4 стало возможным прямое разыменование массива, возвращаемого в качестве результата вызова функции или метода. Раньше приходилось использовать временные переменные.
<?php
function getArray() {
return array(1, 2, 3);
}
// в PHP 5.4
$secondElement = getArray()[1];
// ранее делали так
$tmp = getArray();
$secondElement = $tmp[1];
// или так
list(, $secondElement) = getArray();
?>
Преобразование в массив
Для любого из типов: integer, float, string, boolean и resource, преобразование значения в массив дает результатом массив с одним элементом (с индексом 0), являющимся скалярным значением, с которого вы начали. Другими словами, (array)$scalarValue - это точно то же самое, что и array($scalarValue).
Если вы преобразуете в массив объект (object), вы получите в качестве элементов массива свойства (переменные-члены) этого объекта. Ключами будут имена переменных-членов, с некоторыми примечательными исключениями: к закрытым полям класса (private) спереди будет дописано имя класса; к защищенным полям класса (protected) спереди будет добавлен символ '*'.
class A {
private $a = 'a';
protected $b = 'b';
public $c = 'c';
}
var_dump((array) new A());
/*
array(3) {
["Aa"]=>
string(1) "a"
["*b"]=>
string(1) "b"
["c"]=>
string(1) "c"
}
*/
Если вы преобразуете в массив значение NULL, вы получите пустой массив.