Как получить ключ первой строки двумерного массива, содержащей искомое значение?
Всем привет! Я новичок в PHP и бьюсь над задачей уже второй час. Есть двумерный массив (массив строк с данными пользователей):
$users = [
['id' => 101, 'name' => 'Иван', 'role' => 'admin'],
['id' => 102, 'name' => 'Мария', 'role' => 'editor'],
['id' => 103, 'name' => 'Петр', 'role' => 'admin'],
['id' => 104, 'name' => 'Анна', 'role' => 'user']
];
Мне нужно найти первый уровень ключа (индекс строки) той записи, где name равен 'Мария'. То есть, я хочу получить 1 (индекс второй строки).
Я пробовал использовать array_search, но он работает только с одномерными массивами. Пытался написать цикл, но получается громоздко. Есть ли элегантный способ сделать это без кучи вложенных циклов? Мне нужно именно получить ключ первого совпадения, а не все совпадения.
Заранее спасибо за помощь!
<<Решение с помощью array_filter и array_keys
Лучший способ — комбинация array_filter() и array_keys(). Это чистое функциональное решение без циклов:
<?php
$users = [
['id' => 101, 'name' => 'Иван', 'role' => 'admin'],
['id' => 102, 'name' => 'Мария', 'role' => 'editor'],
['id' => 103, 'name' => 'Петр', 'role' => 'admin'],
['id' => 104, 'name' => 'Анна', 'role' => 'user']
];
$needle = 'Мария';
$filtered = array_filter($users, function($row) use ($needle) {
return $row['name'] === $needle;
});
$keys = array_keys($filtered);
$firstKey = $keys[0] ?? null; // вернет 1
echo $firstKey; // 1
?>
Как это работает
- array_filter() — отфильтровывает только те строки, где
name === 'Мария'. Возвращает новый массив с сохранением исходных ключей. - array_keys() — извлекает все ключи отфильтрованного массива. Поскольку мы сохранили ключи, это будут оригинальные индексы.
- $keys[0] ?? null — берем первый ключ. Если совпадений нет, вернется
null.
Более компактный вариант (одна строка)
$firstKey = array_keys(array_filter($users, fn($row) => $row['name'] === 'Мария'))[0] ?? null;
Вариант с array_search (альтернатива)
Можно использовать array_search в комбинации с array_column, если нужно найти по значению одного поля:
$firstKey = array_search('Мария', array_column($users, 'name'));
Но этот вариант вернет первое вхождение (что и нужно). Однако он не подходит, если условие сложнее (например, проверка нескольких полей).
Важное замечание
Оба метода возвращают false или null, если значение не найдено. Всегда проверяйте результат:
if ($firstKey !== null) {
echo "Найдено на позиции: $firstKey";
} else {
echo "Значение не найдено";
}
Метод с array_filter универсален: вы можете добавить любые условия в callback-функцию. Например, искать по нескольким полям: $row['name'] === 'Мария' && $row['role'] === 'editor'.
Простое решение с циклом foreach
Если вы предпочитаете более читаемый код или работаете со старыми версиями PHP, используйте обычный цикл:
<?php
$users = [...]; // ваш массив
$targetKey = null;
foreach ($users as $key => $row) {
if ($row['name'] === 'Мария') {
$targetKey = $key;
break; // прерываем цикл после первого совпадения
}
}
echo $targetKey; // 1
?>
Почему это может быть лучше
- Производительность: цикл прерывается сразу после нахождения, не обрабатывая весь массив.
- Понятность: новичкам легче читать такой код.
- Гибкость: легко добавить дополнительные условия (например,
isset($row['name'])для избегания ошибок).
Оба подхода (функциональный и императивный) рабочие. Выбирайте тот, который лучше подходит под стиль вашего проекта и версию PHP.
Ответов пока нет.
Войдите чтобы оставить ответ