array_keys в PHP: полное руководство с примерами

Раздел: Разработка на PHP -> Массивы

Функция array_keys: получение ключей массива

Функция array_keys предназначена для извлечения всех или некоторых ключей массива. Результат всегда представляет собой индексированный массив с числовыми ключами, начиная с нуля. Эта функция полезна для перебора, анализа структуры данных, поиска по значению и других задач.

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

Простой вызов array_keys($array) возвращает массив ключей.


$arr = ['name' => 'John', 'age' => 30, 'city' => 'New York'];
$keys = array_keys($arr);
print_r($keys);
Array
(
    [0] => name
    [1] => age
    [2] => city
)

Это наиболее эффективное решение для получения полного списка ключей, не требующее дополнительных условий. Ключи возвращаются в том же порядке, в котором они определены в массиве.

Типичная ошибка: передача не массива (например, null) приводит к предупреждению Warning: array_keys() expects parameter 1 to be array, .... Следует всегда проверять тип данных перед вызовом.

Как найти все ключи, соответствующие определённому значению?

Второй аргумент search_value ограничивает результат только теми ключами, значения которых равны переданному. По умолчанию сравнение производится без учёта типа (==).


$numbers = [10, 20, 10, 30, '10'];
$keys = array_keys($numbers, 10);
print_r($keys);
Array
(
    [0] => 0
    [1] => 2
    [2] => 4
)

Стоит обратить внимание, что строка '10' также была найдена, поскольку 10 == '10' истинно. Это может быть неожиданным, если требуется строгое совпадение.

Проблема: нестрогое сравнение может привести к ложным результатам. Например, числа 0 и строка '0' или false при нестрогом сравнении считаются равными. Для точного поиска рекомендуется использовать третий аргумент strict.

Как выполнить строгий поиск ключей по значению?

При передаче true в качестве третьего аргумента strict используется оператор ===, что гарантирует совпадение и типа, и значения.


$mixed = [0, '0', false, ''];
$keys = array_keys($mixed, '0', true);
print_r($keys);
Array
(
    [0] => 1
)

В этом примере найден только один ключ (индекс 1), соответствующий строке '0'. Числовой ноль, логическое false и пустая строка были отброшены, так как их типы отличаются.

Распространённая ошибка: забывают указать третий аргумент, когда точное совпадение критично. Всегда стоит думать о возможных типах значений в массиве, особенно при работе с данными из внешних источников (формы, базы данных), где строки могут быть перепутаны с числами.

Как получить ключи, удовлетворяющие произвольному условию?

Функция array_keys не поддерживает фильтрацию по callback. Однако можно скомбинировать её с array_filter. Сначала отфильтровать массив по условию, затем извлечь ключи.


$products = ['apple' => 150, 'banana' => 80, 'cherry' => 200];
$filtered = array_filter($products, function($price) { return $price > 100; });
$keys = array_keys($filtered);
print_r($keys);
Array
(
    [0] => apple
    [1] => cherry
)

Этот подход даёт гибкость: можно проверять любые условия, включая проверку самого ключа через array_filter с ARRAY_FILTER_USE_BOTH. Но для простых сравнений значений уже есть встроенный второй аргумент.

Проблема: array_filter возвращает массив с сохранёнными ключами. Если требуется сбросить индексы, можно применить array_values.

Расширенные примеры извлечения ключей

Пример 1. Пустой массив

Пример

$empty = [];
print_r(array_keys($empty));
Array
(
)

Функция корректно обрабатывает пустой массив, возвращая пустой массив ключей.

Пример 2. Ключи из многомерного массива (рекурсивный сбор)

Стандартная array_keys не проникает во вложенные массивы. Для получения всех ключей рекурсивно потребуется пользовательская функция.

Пример

function recursive_array_keys($arr) {
    $keys = [];
    foreach ($arr as $key => $val) {
        $keys[] = $key;
        if (is_array($val)) {
            $keys = array_merge($keys, recursive_array_keys($val));
        }
    }
    return $keys;
}
$multi = [
    'a' => ['b' => 1, 'c' => 2],
    'd' => 3,
    'e' => ['f' => ['g' => 4]]
];
print_r(recursive_array_keys($multi));
Array
(
    [0] => a
    [1] => b
    [2] => c
    [3] => d
    [4] => e
    [5] => f
    [6] => g
)

Пример 3. Получение ключей объекта после приведения к массиву

Пример

$obj = new stdClass();
$obj->name = 'Alice';
$obj->age = 25;
$arr = (array) $obj;
print_r(array_keys($arr));
Array
(
    [0] => name
    [1] => age
)

Пример 4. Использование array_keys вместе с array_count_values

Пример

$words = ['apple', 'banana', 'apple', 'cherry', 'banana', 'banana'];
$counts = array_count_values($words);
$unique = array_keys($counts);
print_r($unique);
Array
(
    [0] => apple
    [1] => banana
    [2] => cherry
)

Пример 5. Строгий поиск с null и false

Пример

$values = [null, false, 0, 'null'];
$keys = array_keys($values, null, true);
print_r($keys);
Array
(
    [0] => 0
)

Только первый элемент null совпал строго, остальные имеют другой тип.

Пример 6. Фильтрация по значению ключа (с использованием callback)

Пример

$items = ['id_1' => 10, 'id_2' => 20, 'special' => 30];
$keys = array_keys(array_filter($items, function($value, $key) {
    return strpos($key, 'id') === 0;
}, ARRAY_FILTER_USE_BOTH));
print_r($keys);
Array
(
    [0] => id_1
    [1] => id_2
)

Функция array_keys в PHP - comments

En
Php array keys (php)