Разработка на 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.


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

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