PHP: Как реализовать метод findUserInBatch, который ищет пользователя в массиве по нику, SteamID или внутреннему ID сразу по нескольким критериям?

Метод findUserInBatch позволяет гибко искать пользователя в массиве данных сразу по нескольким критериям: никнейму, SteamID и внутреннему идентификатору. Это удобно, когда входные данные могут быть разного типа, и вы хотите унифицировать поиск в одном методе.

## Базовая реализация

php
function findUserInBatch(array $users, $query): ?array {
foreach ($users as $user) {
if (
(isset($user[‘nick’]) && strtolower($user[‘nick’]) === strtolower((string)$query)) ||
(isset($user[‘steam_id’]) && $user[‘steam_id’] === (string)$query) ||
(isset($user[‘id’]) && (int)$user[‘id’] === (int)$query)
) {
return $user;
}
}
return null;
}

Здесь поиск ведётся по трём полям одновременно. Сравнение ника выполняется без учёта регистра через `strtolower`, SteamID сравнивается как строка, а внутренний ID — как целое число.

## Расширенная версия с возвратом всех совпадений

Если нужно найти не одного, а всех подходящих пользователей:

php
function findUserInBatch(array $users, $query): array {
$results = [];
$queryStr = strtolower((string)$query);
$queryInt = (int)$query;

foreach ($users as $user) {
$matchNick = isset($user[‘nick’]) && strtolower($user[‘nick’]) === $queryStr;
$matchSteam = isset($user[‘steam_id’]) && $user[‘steam_id’] === (string)$query;
$matchId = isset($user[‘id’]) && (int)$user[‘id’] === $queryInt;

if ($matchNick || $matchSteam || $matchId) {
$results[] = $user;
}
}

return $results;
}

## Версия с приоритетом критериев

Иногда нужно сначала искать по ID (наиболее точный критерий), затем по SteamID, и только потом по нику:

php
function findUserInBatch(array $users, $query): ?array {
$byId = null;
$bySteam = null;
$byNick = null;

foreach ($users as $user) {
if (!$byId && isset($user[‘id’]) && (int)$user[‘id’] === (int)$query) {
$byId = $user;
}
if (!$bySteam && isset($user[‘steam_id’]) && $user[‘steam_id’] === (string)$query) {
$bySteam = $user;
}
if (!$byNick && isset($user[‘nick’]) && strtolower($user[‘nick’]) === strtolower((string)$query)) {
$byNick = $user;
}
}

return $byId ?? $bySteam ?? $byNick;
}

## Пример использования

php
$users = [
[‘id’ => 1, ‘nick’ => ‘ProGamer’, ‘steam_id’ => ‘76561198000000001’],
[‘id’ => 2, ‘nick’ => ‘DarkKnight’, ‘steam_id’ => ‘76561198000000002’],
[‘id’ => 3, ‘nick’ => ‘ShadowFox’, ‘steam_id’ => ‘76561198000000003’],
];

$user = findUserInBatch($users, ‘darkKnight’); // найдёт по нику
$user = findUserInBatch($users, ‘76561198000000001’); // найдёт по SteamID
$user = findUserInBatch($users, 2); // найдёт по ID

## Рекомендации

— Всегда приводите типы перед сравнением, чтобы избежать неожиданных совпадений.
— Для больших массивов стоит предварительно индексировать данные по каждому критерию с помощью `array_column`.
— При работе с базой данных лучше перенести логику в SQL-запрос с условием `WHERE id = ? OR steam_id = ? OR nick = ?`.


Задайте вопрос нейросети

Не нашли ответ? Спросите ИИ — он подготовит развёрнутую статью.