Menu

Ассоциативные массивы PHP: пары ключ и значение

Ассоциативный массив PHP хранит значения под ключами, которые вы называете сами: $user = ['name' => 'Ada', 'age' => 36]; читается как $user['name']. Как добавлять, менять и удалять пары, обходить ключи и значения, получать все ключи или значения, проверять ключ и сортировать по ключу или значению.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

Ассоциативный массив хранит каждое значение под ключом, который вы выбираете, в виде key => value: $user = ['name' => 'Ada', 'age' => 36];. Значение читается через $user['name'], а добавить или изменить его можно присваиванием по ключу: $user['email'] = 'ada@example.com';.

В других языках такую структуру называют словарём, map или хешем. В PHP это обычный массив, ключи которого строки, а не 0, 1, 2.

Добавление, изменение и удаление пар

Присваивание по несуществующему ключу добавляет пару в конец. Присваивание по существующему ключу заменяет значение и сохраняет позицию. unset() удаляет пару.

array_push() здесь не поможет: она умеет добавлять только значения с числовыми ключами. Чтобы добавить несколько пар сразу, используйте array_merge($stock, $more), где побеждают новые значения, или $stock + $more, где существующие ключи сохраняют свои значения; на странице про array_merge эти способы сравниваются.

Обход ключей и значений

foreach ($array as $key => $value) проходит пары в порядке добавления. Уберите $key =>, когда нужны только значения.

Все ключи или все значения

array_keys() возвращает ключи простым списком, а array_values() возвращает значения, оба с новой нумерацией от 0. Если передать array_keys() второй аргумент, она вернёт только ключи с этим значением, так находят все ключи для значения.

Для одного ключа array_search() возвращает первое совпадение или false, если его нет. Почему этот результат нужно сравнивать через !== false, объясняется на странице про array_search.

Проверка, есть ли ключ

isset($arr['key']) это обычная и самая быстрая проверка, но она возвращает false, когда ключ существует и хранит null. array_key_exists('key', $arr) в этом случае возвращает true. Для чтения со значением по умолчанию оператор ?? делает и то, и другое сразу.

Сортировка по ключу или значению

ksort() сортирует по ключу, а asort() по значению, обе оставляют каждый ключ привязанным к его значению. krsort() и arsort() сортируют в обратном порядке. Не используйте sort() для ассоциативного массива: она выбрасывает ключи и нумерует заново с 0.

Все эти функции сортируют на месте и возвращают true, поэтому $sorted = ksort($arr) даст true, а не массив. Для своего порядка есть uasort() и uksort().

Перевернуть, посчитать и превратить в JSON

С данными ключ/значение снова и снова встречаются несколько однострочников: array_flip() меняет местами ключи и значения, array_count_values() считает, сколько раз встречается каждое значение, а json_encode() превращает массив в JSON-объект.

Частая ошибка: чтение ключа, которого нет

Чтение отсутствующего ключа возвращает null, но ваш PHP ещё и печатает предупреждение:

<?php
$user = ['name' => 'Ada'];
echo $user['phone'];
Warning: Undefined array key "phone" in /var/www/html/index.php on line 3

Задайте значение по умолчанию через ??, который никогда не предупреждает, или сначала проверьте через isset(), когда для отсутствующего ключа нужна отдельная ветка.

Внутри строки в двойных кавычках оборачивайте обращение в фигурные скобки, "{$user['email']}". Без них PHP принимает только форму без кавычек "$user[email]", в которой легко ошибиться.

Часто задаваемые вопросы

Как создать ассоциативный массив в PHP?

Запишите каждую пару как key => value внутри квадратных скобок: $prices = ['apple' => 1.2, 'pear' => 0.9];. Значение читается через $prices['apple'].

Как отсортировать ассоциативный массив по ключу в PHP?

Вызовите ksort($arr); для порядка от A до Z или krsort($arr); для обратного. Обе функции сортируют на месте, оставляют каждое значение при своём ключе и возвращают true, а не отсортированный массив.

Как обойти ассоциативный массив в PHP?

Используйте foreach с обеими переменными: foreach ($prices as $fruit => $price) { echo "$fruit: $price\n"; }. Пары выходят в том порядке, в каком их добавляли.

Как получить все ключи ассоциативного массива?

array_keys($arr) возвращает ключи в виде индексного массива, а array_values($arr) возвращает значения. array_keys($arr, $value) возвращает только ключи, значение которых равно $value.

Сохраняет ли ассоциативный массив PHP порядок добавления?

Да. Массивы PHP это упорядоченные словари, поэтому foreach, print_r и json_encode видят пары в порядке добавления, пока вы не отсортируете массив через ksort(), asort() или похожую функцию.

Иллюстрация языков программирования Coddy

Учитесь программировать с Coddy

НАЧАТЬ