Основы

Массив в 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, вы получите пустой массив.