Ассоциативные массивы в PHP
Ассоциативные массивы PHP: создание, чтение, обновление, перебор foreach, сортировка по ключу и значению, типичные ошибки.
Ассоциативный array в PHP хранит значения под именованными ключами вместо числовых позиций. Там, где индексированный array отвечает на вопрос «что находится на позиции 2?», ассоциативный array отвечает на вопрос «какое значение у ключа email?» — именно так моделируются записи, конфигурации и справочники в реальном коде.
В этой главе рассказывается, как создавать ассоциативные массивы, читать и обновлять их, перебирать в цикле, сортировать по ключу или значению и избегать типичных ошибок, с которыми сталкиваются новички.
Что такое ассоциативный array?
Ассоциативный array — это array, элементы которого доступны по строковому ключу (иначе называемому индексом), а не по целочисленной позиции. Каждый ключ должен быть уникальным — присвоение значения существующему ключу перезаписывает старое значение.
$user = [
"name" => "Alice",
"email" => "[email protected]",
"age" => 30,
];Внутри PHP имеет только один тип array. «Индексированный» array — это просто ассоциативный array, ключами которого оказываются целые числа 0, 1, 2, …. Поэтому в одном array можно свободно смешивать строковые и целочисленные ключи.
Создание ассоциативного array
Есть два равнозначных способа. Синтаксис с короткими скобками [] (PHP 5.4+) предпочтителен в современном коде; функция array() даёт тот же результат.
// Short array syntax (recommended)
$fruits = ["apple" => "red", "banana" => "yellow", "grapes" => "green"];
// Long syntax — identical result
$fruits = array("apple" => "red", "banana" => "yellow", "grapes" => "green");Можно также добавлять ключи по одному — это удобно при построении array в цикле:
$prices = [];
$prices["coffee"] = 2.5;
$prices["tea"] = 2.0;Порядок, в котором назначаются ключи, сохраняется — PHP arrays запоминают порядок вставки, поэтому при последующем переборе coffee окажется перед tea.
Доступ к значениям
Читайте значение по ключу в квадратных скобках:
$fruits = ["apple" => "red", "banana" => "yellow"];
echo $fruits["apple"]; // redЕсли ключ не существует, PHP выдаёт предупреждение и возвращает null. Чтобы читать безопасно, сначала проверьте наличие с помощью array_key_exists() или используйте оператор объединения с null ?? для задания значения по умолчанию:
$color = $fruits["mango"] ?? "unknown";
echo $color; // unknown — no warningДобавление и изменение значений
Присвоение по ключу либо обновляет существующий элемент, либо добавляет новый:
$fruits = ["apple" => "red"];
$fruits["apple"] = "green"; // modify existing key
$fruits["cherry"] = "dark red"; // add a new key
print_r($fruits);
// Array ( [apple] => green [cherry] => dark red )Удалить элемент можно с помощью unset():
unset($fruits["apple"]);Перебор ассоциативного array
Обычный цикл for здесь не подходит, поскольку нет последовательных числовых индексов. Используйте foreach с формой key => value для обхода как ключей, так и значений:
$user = ["name" => "Alice", "email" => "[email protected]", "age" => 30];
foreach ($user as $field => $value) {
echo "$field: $value\n";
}
// name: Alice
// email: [email protected]
// age: 30Сортировка ассоциативных массивов
Поскольку ключи несут смысловую нагрузку, для сортировки используются функции, сохраняющие связь ключ/значение — sort() уничтожила бы ключи. Используйте:
ksort()/krsort()— сортировка по ключу по возрастанию / убываниюasort()/arsort()— сортировка по значению по возрастанию / убыванию
$scores = ["Bob" => 75, "Alice" => 90, "Carol" => 82];
arsort($scores); // sort by value, highest first
foreach ($scores as $name => $score) {
echo "$name: $score\n";
}
// Alice: 90
// Carol: 82
// Bob: 75Полный набор функций сортировки см. в разделе Сортировка массивов в PHP.
Типичные ошибки
- Повторное использование ключа перезаписывает значение без предупреждения.
["a" => 1, "a" => 2]даёт["a" => 2]— ошибки нет, первое значение теряется. - Числовые строковые ключи преобразуются в целые числа.
["10" => "x"]хранится под целочисленным ключом10.$arr["10"]и$arr[10]ссылаются на один и тот же элемент. - Ключи
true/false/nullприводятся к типу. Ключtrueстановится1,falseиnull—0и"". Используйте в качестве ключей только обычные строки и целые числа. - Не полагайтесь на
for ($i = 0; …). Используйтеforeach,array_keys()илиarray_values()для перебора, когда ключи не являются последовательностью0..n.
Заключение
Ассоциативные массивы позволяют хранить данные под осмысленными уникальными строковыми ключами — идеально для записей, настроек и справочных таблиц. Читайте с помощью $arr["key"] (защищайтесь от отсутствующих ключей оператором ??), обновляйте или добавляйте элементы присвоением, удаляйте через unset(), перебирайте с foreach и сортируйте функциями, сохраняющими ключи, такими как ksort() и asort().
Для дальнейшего изучения исследуйте индексированные массивы, многомерные массивы (массивы из ассоциативных массивов) и array_keys() для извлечения всех ключей сразу.