Тип данных Array
Массив в PHP - это упорядоченное отображение, которое устанавливает соответствие между значением и ключом.
В PHP существует три типа массивов
- Индексированные массивы - массивы с числовым индексом
- Ассоциативные массивы - массивы с именованными ключами
- Многомерные массивы - массивы , содержащие один или несколько массивов
Синтаксис
Массив может быть создан языковой конструкцией array()
. В качестве параметров она принимает любое количество разделенных запятыми пар key => value
(ключ => значение).
array(
key => value,
key2 => value2,
key3 => value3,
...
)
Запятая после последнего элемента массива необязательна и может быть опущена. Обычно это делается для однострочных массивов, т.е. array(1, 2)
предпочтительней array(1, 2, )
. Для многострочных массивов с другой стороны обычно используется завершающая запятая, так как позволяет легче добавлять новые элементы в конец массива.
Начиная с PHP 5.4 возможно использовать короткий синтаксис определения массивов, который заменяет языковую конструкцию array()
на []
.
$arr = array(
"apple" => 3.5,
"book" => 1,
);
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).
Если несколько элементов в объявлении массива используют одинаковый ключ, то только последний будет использоваться, а все другие будут перезаписаны.
Параметр key
является необязательным. Если он не указан, PHP будет использовать предыдущее наибольшее значение ключа типа integer
, увеличенное на 1.
$arr = array ("Hello", "user", "zamt");
var_dump ($arr);//[0] - "Hello", [1] - "user", [2] - "zamt"
Доступ к элементам массива
Доступ к элементам массива может быть осуществлен с помощью синтаксиса array[key]
.
$arr = array("Hello", "user", "zamt");
echo $arr[2]; // "zamt"
/* Поинтереснее пример */
//многомерный массив для демонстрации
$arr = [
"fio" => "Ivan Inanov",
"age" => 24,
"tel" => array(
"mobile" => "9908906532",
"home" => "75245",
),
2 => 2456,
];
//доступ через квадратные скобки
echo "\n".$arr[2];
echo "\n".$arr["fio"];
echo "\n".$arr["tel"]["home"];
И квадратные и фигурные скобки можно взаимозаменяемо использовать для доступа к элементам массива (т.е. и$array[42]
и$array{42}
равнозначны).
С PHP 5.4 стало возможным прямое разыменование массива, возвращаемого в качестве результата вызова функции или метода. Раньше приходилось использовать временные переменные.
С PHP 5.5 возможно разыменовывать массив буквально.
function getArr() {
return array(mt_rand(0, 40), mt_rand(50, 60), mt_rand(123, 459));
}
echo getArr()[1] . PHP_EOL;
$new_arr = getArr();
var_dump($new_arr);
/* Что здесь будет? */
$new_arr += getArr();
var_dump($new_arr);
Попытка доступа к неопределенному ключу в массиве - это то же самое, что и попытка доступа к любой другой неопределенной переменной: будет сгенерирована ошибка и результат будет NULL
.
Модификация массива
Существующий массив может быть изменен явной установкой значений в нем.
Это выполняется присвоением значений массиву array
с указанием в скобках ключа. Кроме того, вы можете опустить ключ. В этом случае добавьте к имени переменной пустую пару скобок ([]).
$arr[key] = value;
$arr[] = value;
// key может быть integer или string
// value может быть любым значением любого типа
Если массив $arr
еще не существует, он будет создан. Таким образом, это еще один способ определить массив array
. Однако такой способ применять не рекомендуется. Лучше инициализировать переменную путем явного присваивания значения.
Начиная с PHP 7.1.0, используя в оператор "пустой индекс" на строке, приведет к фатальной ошибке. Ранее, в этом случае, строка молча преобразовывалась в массив.
Для изменения определенного значения просто присвойте новое значение элементу, используя его ключ. Если вы хотите удалить пару ключ/значение, вам необходимо использовать функцию unset()
.
$arr = [
5 => "five",
9 => "nine",
];
/* Добавим пару элементов */
$arr[] = "ten"; //$arr[10]
var_dump($arr);
$arr[5] = "newFIVE";
var_dump($arr);
$arr[0] = "zero";
var_dump($arr);
/* Удаление элементов */
foreach($arr as $key => $val) {
echo "Удалили [$key] = $val".PHP_EOL;
unset($arr[$key]);
}
var_dump($arr);
/* Удаление массива */
unset($arr);
//var_dump($arr);//выдаст ошибку
$newArr["one"] = "test";//так не рекомендуется создавать массивы
var_dump($newArr);
Как уже говорилось, если ключ не был указан, то будет взят максимальный из существующих целочисленных (integer
) индексов, и новым ключом будет это максимальное значение (в крайнем случае 0) плюс 1. Если целочисленных индексов еще нет, то ключом будет 0 (ноль).
Учтите, что максимальное целое значение ключа не обязательно существует в массиве в данный момент. Оно могло просто существовать в массиве какое-то время, с тех пор как он был переиндексирован в последний раз.
$arr = array(0, 1, 2,);
var_dump($arr);
/* Удаление всех элементов */
foreach($arr as $key => $val) {
unset($arr[$key]);
}
$arr[] = 3;
var_dump($arr); // Будет [3] = [3] ,а не [0] = [3]
/* Но можно всё исправить */
$arr = array_values($arr); // переиндексация массива
$arr[] = 4;
var_dump($arr);
Функции для работы с массивами
Для работы с массивами существует достаточное количество полезных функций.