Разработка на PHP: Как реализовать поиск по массиву объектов и вернуть только те записи, которые содержат определенную подстроку?
Поиск по массиву объектов в PHP — одна из самых распространённых задач при разработке веб-приложений. Рассмотрим несколько подходов для фильтрации массива объектов по наличию определённой подстроки в одном или нескольких свойствах.
## Метод 1: array_filter + strpos
Самый простой и читаемый способ — использовать функцию `array_filter` в связке с `strpos`:
php
$objects = [
(object)[‘name’ => ‘Иван Петров’, ’email’ => ‘ivan@example.com’],
(object)[‘name’ => ‘Мария Сидорова’, ’email’ => ‘maria@test.com’],
(object)[‘name’ => ‘Алексей Иванов’, ’email’ => ‘alex@example.com’],
];
$search = ‘example’;
$result = array_filter($objects, function($obj) use ($search) {
return strpos($obj->email, $search) !== false;
});
print_r(array_values($result));
Функция `strpos` возвращает позицию первого вхождения подстроки или `false`, если подстрока не найдена. Важно использовать строгое сравнение `!== false`, так как позиция может быть равна нулю.
## Метод 2: Поиск без учёта регистра с stripos
Если нужен регистронезависимый поиск, используйте `stripos`:
php
$result = array_filter($objects, function($obj) use ($search) {
return stripos($obj->name, $search) !== false;
});
## Метод 3: Поиск по нескольким полям объекта
Часто требуется искать подстроку сразу в нескольких свойствах объекта:
php
$search = ‘иван’;
$result = array_filter($objects, function($obj) use ($search) {
return stripos($obj->name, $search) !== false
|| stripos($obj->email, $search) !== false;
});
## Метод 4: Использование регулярных выражений с preg_match
Для более сложных паттернов поиска подойдёт `preg_match`:
php
$pattern = ‘/иван/ui’;
$result = array_filter($objects, function($obj) use ($pattern) {
return preg_match($pattern, $obj->name);
});
Флаг `u` обеспечивает корректную работу с UTF-8, флаг `i` — регистронезависимость.
## Метод 5: Поиск с использованием стрелочных функций (PHP 7.4+)
Начиная с PHP 7.4 доступны стрелочные функции, которые делают код компактнее:
php
$search = ‘example’;
$result = array_filter($objects, fn($obj) => stripos($obj->email, $search) !== false);
## Советы по производительности
— Для больших массивов (тысячи объектов) рассмотрите использование базы данных с индексами вместо поиска в памяти.
— Если поиск выполняется часто по одному и тому же полю, предварительно создайте индексный массив.
— Функция `mb_strpos` подходит для многобайтовых строк (кириллица, китайский и т.д.).
В итоге `array_filter` с `stripos` или `mb_stripos` — это оптимальный и понятный подход для большинства задач фильтрации массивов объектов по подстроке в PHP.
