Массивы в PHP: как извлечь ключи - практическое руководство

Раздел: PHP -> Массивы

Получение ключей массива в PHP

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

$fruits = ["apple" => 1, "banana" => 2, "cherry" => 3];
$keys = array_keys($fruits);
print_r($keys);

/* Результат:
Array
(
    [0] => apple
    [1] => banana
    [2] => cherry
)
*/

Php ключи массива (получение ключей массива в php)

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

Типичная ошибка:

Неопытные разработчики пытаются перебирать массив с помощью цикла и вручную сохранять ключи, хотя array_keys() делает это быстрее и проще. Другая проблема – путаница с возвращаемым типом: функция всегда возвращает индексированный массив, даже если исходные ключи были строковыми.


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

Когда требуется найти все ключи, соответствующие определённому значению, array_keys() принимает второй аргумент.

$grades = ["Alice" => 90, "Bob" => 85, "Charlie" => 90];
$keys = array_keys($grades, 90);
print_r($keys);
// ["Alice", "Charlie"]

Php массивы индексы (получение индексов массива в php)

Можно добавить третий аргумент true для строгого сравнения (проверка типа).

$mixed = [1, "1", 2];
$strictKeys = array_keys($mixed, "1", true);
print_r($strictKeys);
// [1] (потому что строгое сравнение находит только строку "1")

массив данных php (работа с массивом данных в php)

Если массив содержит повторяющиеся значения, функция вернёт все соответствующие ключи. Порядок сохраняется.

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

Для проверки, существует ли ключ в массиве, используется array_key_exists() (устаревший аналог – isset() с оговорками).

$user = ["name" => "John", "age" => 30];
if (array_key_exists("email", $user)) {
    echo "Email указан";
} else {
    echo "Email отсутствует";
}

массив ли php (проверка, является ли переменная массивом в php)

Важно: isset() возвращает false, если значение ключа равно null, в то время как array_key_exists() вернёт true независимо от значения.

Ошибка:

Использование isset() для проверки наличия ключа, когда значение может быть null, приводит к ложноотрицательному результату. Рекомендуется array_key_exists().

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

Начиная с PHP 7.3 доступны функции array_key_first() и array_key_last().

$data = ["x" => 1, "y" => 2, "z" => 3];
$firstKey = array_key_first($data); // "x"
$lastKey = array_key_last($data);   // "z"

Php разбить массив (разбиение массива на части в php)

Для старых версий PHP можно использовать reset() и end() в сочетании с key().

$firstKey = key($data); // после reset()
reset($data);
$firstKey = key($data);
end($data);
$lastKey = key($data);

Php переменные массив (создание массива из переменных в php)

Проблема с пустым массивом:

Если массив пустой, array_key_first() и array_key_last() возвращают null. При использовании reset()/end() нужно проверять, не переместился ли внутренний указатель за пределы.

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

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

function recursiveArrayKeys($array) {
    $keys = [];
    foreach ($array as $key => $value) {
        $keys[] = $key;
        if (is_array($value)) {
            $keys = array_merge($keys, recursiveArrayKeys($value));
        }
    }
    return $keys;
}

$multi = ["a" => ["b" => 1, "c" => ["d" => 2]]];
$allKeys = recursiveArrayKeys($multi);
print_r($allKeys);
// ["a", "b", "c", "d"]

Php сортировка массива (сортировка массива в php)

Важно: данный способ не различает уровни вложенности. Если нужна иерархия, можно передавать префикс.

Ошибка:

При использовании array_merge в цикле может снизиться производительность на больших массивах. Альтернативно можно использовать SplObjectStorage или генераторы.

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

Можно комбинировать array_keys() с array_diff() или фильтрацией через array_filter().

$inventory = ["pencil" => 5, "pen" => 3, "eraser" => 0];
// получить ключи, где значение больше 0
$availableKeys = array_keys(array_filter($inventory, fn($v) => $v > 0));
print_r($availableKeys);
// ["pencil", "pen"]

ассоциативный массив php (ассоциативные массивы в php)

Также можно удалить ключи по чёрному списку:

$allKeys = array_keys($inventory);
$exclude = ["eraser"];
$filteredKeys = array_diff($allKeys, $exclude);
// ["pencil", "pen"]

Php удалить массива (удаление всего массива в php)

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

Функция array_reverse() применяется к результату array_keys().

$arr = ["one" => 1, "two" => 2, "three" => 3];
$reversedKeys = array_reverse(array_keys($arr));
print_r($reversedKeys);
// ["three", "two", "one"]

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


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

- Php array keys (функция array_keys в php)
- Php массив в строку (преобразование массива в строку php)
- Php key (ключи и массивы в php)

Расширенные и нестандартные примеры получения ключей массива

Получение ключей с преобразованием типов

При использовании array_keys() ключи автоматически приводятся к строке или целому числу. Для получения оригинального представления можно воспользоваться var_export() или приведением типов.

Пример
$data = [1 => "a", "1" => "b", 2 => "c"];
$keys = array_keys($data);
// PHP преобразует строковый ключ "1" к целому 1, поэтому в результате два одинаковых ключа 1 и 2
print_r($keys);
// [1, 2]

Вывод: в PHP ключи массивов всегда нормализуются (строковые числа преобразуются в целые). Это важный момент при отладке.

Генерация ключей из значений с помощью array_flip() и array_keys()

Функция array_flip() меняет местами ключи и значения. После флипа можно получить исходные значения теперь как ключи.

Пример
$roles = ["admin" => 1, "editor" => 2, "user" => 3];
$flipped = array_flip($roles);
$originalValuesAsKeys = array_keys($flipped);
print_r($originalValuesAsKeys);
// [1, 2, 3]

Этот приём удобен, когда нужно гарантировать уникальность значений (флип сбрасывает дубликаты).

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

Пример
$duplicated = ["x" => 1, "y" => 1, "z" => 2];
$keysWithValue1 = array_keys($duplicated, 1);
print_r($keysWithValue1);
// ["x", "y"]

Рекурсивное получение ключей с сохранением структуры

Иногда требуется получить плоский список ключей, но с указанием пути (например, a.b.c).

Пример
function nestedKeys($array, $prefix = "") {
    $keys = [];
    foreach ($array as $key => $value) {
        $currentKey = ($prefix === "") ? $key : $prefix . "." . $key;
        $keys[] = $currentKey;
        if (is_array($value)) {
            $keys = array_merge($keys, nestedKeys($value, $currentKey));
        }
    }
    return $keys;
}

$nested = ["a" => ["b" => ["c" => 1], "d" => 2]];
$allNestedKeys = nestedKeys($nested);
print_r($allNestedKeys);
// ["a", "a.b", "a.b.c", "a.d"]

Для больших массивов лучше использовать генератор, чтобы не хранить все ключи в памяти.

Пример
function nestedKeysGenerator($array, $prefix = "") {
    foreach ($array as $key => $value) {
        $currentKey = ($prefix === "") ? $key : $prefix . "." . $key;
        yield $currentKey;
        if (is_array($value)) {
            yield from nestedKeysGenerator($value, $currentKey);
        }
    }
}

$keysIter = nestedKeysGenerator($nested);
foreach ($keysIter as $k) echo $k . "\n";

Применение array_keys() совместно с array_map() для обработки ключей

Можно преобразовать ключи массива, например, перевести в верхний регистр, не меняя структуру данных. Для этого создаётся новый массив с изменёнными ключами.

Пример
$original = ["firstName" => "John", "lastName" => "Doe"];
$newKeys = array_map('strtoupper', array_keys($original));
$newArray = array_combine($newKeys, array_values($original));
print_r($newArray);
// ["FIRSTNAME" => "John", "LASTNAME" => "Doe"]

array_combine() создаёт массив из массивов ключей и значений. Следует убедиться, что количество элементов совпадает.

Если исходный массив содержит повторяющиеся значения, array_combine() перезапишет предыдущие. В таком случае лучше использовать цикл foreach.

Получение ключей массива с использованием итератора RecursiveArrayIterator

Класс RecursiveArrayIterator позволяет обходить многомерные массивы без написания рекурсивных функций.

Пример
$multi = ["a" => ["b" => 1], "c" => 2];
$iterator = new RecursiveIteratorIterator(
    new RecursiveArrayIterator($multi)
);
$keys = [];
foreach ($iterator as $key => $value) {
    // Получить глубину: $iterator->getDepth()
    $keys[] = $key;
}
print_r($keys);
// ["b", "c"]

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

Получение ключей по маске с помощью preg_grep

Если ключи являются строками и их нужно отфильтровать по регулярному выражению, комбинируем array_keys() и preg_grep().

Пример
$env = ["DB_HOST" => "localhost", "DB_USER" => "root", "APP_DEBUG" => true];
$dbKeys = preg_grep('/^DB_/', array_keys($env));
print_r($dbKeys);
// [0 => "DB_HOST", 1 => "DB_USER"]
// Или с сохранением исходных ключей:
$dbKeysAssoc = array_intersect_key($env, array_flip($dbKeys));
print_r($dbKeysAssoc);
// ["DB_HOST" => "localhost", "DB_USER" => "root"]

preg_grep() возвращает индексированный массив совпадений. Для обратной операции (ключи, не соответствующие маске) используйте третий параметр PREG_GREP_INVERT.

Использование array_filter() с ARRAY_FILTER_USE_KEYS для фильтрации по ключам

Начиная с PHP 5.6, array_filter() поддерживает флаг ARRAY_FILTER_USE_KEYS, позволяющий фильтровать массив на основе ключа, а не значения.

Пример
$userData = ["id" => 1, "name" => "Alice", "password" => "secret", "age" => 25];
$publicKeys = array_keys(array_filter($userData, function($key) {
    return $key !== "password";
}, ARRAY_FILTER_USE_KEYS));
print_r($publicKeys);
// ["id", "name", "age"]

Этот подход часто используется при подготовке ответов API, когда нужно исключить чувствительные поля.

Получение ключей массива в PHP - comments

En
Php ключи массива (php)