Поиск информации в PHP: обзор техник для работы с данными

Раздел: Программирование на PHP -> Работа с данными

Основные подходы к поиску данных в PHP

Как найти подстроку в строке?

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

$text = 'Ищем подстроку в этом предложении';
$pos = strpos($text, 'подстроку');
if ($pos !== false) {
    echo 'Найдено на позиции: ' . $pos;
} else {
    echo 'Не найдено';
}

поиск данных php (поиск данных в php (общие методы))

Найдено на позиции: 6

View php table (php: отображение таблиц)

Вариант: str_contains() (PHP 8+) - возвращает true/false без позиции.

if (str_contains($text, 'подстроку')) {
    echo 'Содержит';
}

Index php collection (коллекции в php)

Вариант: preg_match() для поиска по регулярному выражению.

if (preg_match('/подстр\w+/u', $text)) {
    echo 'Совпадение найдено';
}

Php tables (работа с таблицами в php)

Типичная ошибка: использование if (strpos(...)) без строгого сравнения - если подстрока находится в начале строки (позиция 0), условие ложно. Исправляется проверкой !== false.

Проблема: регистрозависимость. stripos() ищет без учёта регистра.

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

Функция in_array() - простой и быстрый способ проверки существования значения. По умолчанию использует слабое сравнение, но можно включить строгий режим третьим параметром true.

$fruits = ['apple', 'banana', 'cherry'];
if (in_array('banana', $fruits, true)) {
    echo 'Элемент найден';
}

несколько php (несколько php)

Вариант: array_search() - возвращает ключ найденного элемента.

$key = array_search('cherry', $fruits);
if ($key !== false) {
    echo "Ключ: $key";
}

Вариант: array_key_exists() для проверки существования ключа.

if (array_key_exists('color', $data)) {
    echo 'Ключ существует';
}

Вариант: array_filter() для поиска по условию.

$numbers = [1,4,7,9];
$found = array_filter($numbers, fn($v) => $v > 5);
if (!empty($found)) {
    echo 'Найдены числа больше 5';
}

Типичная ошибка: забыть указать строгий режим при поиске смешанных типов (например, '1' vs 1). При слабом сравнении '1' и 1 считаются равными.

Проблема: in_array() выполняет полный перебор массива; для больших массивов может быть медленным. Альтернатива - использовать хеш-таблицы (ассоциативные массивы) для O(1) поиска.

Как найти текст в файле?

Для небольших файлов эффективно загрузить всё содержимое file_get_contents() и затем применить strpos(). Это минимизирует количество операций ввода-вывода.

$content = file_get_contents('data.txt');
if (strpos($content, 'искомый текст') !== false) {
    echo 'Текст найден в файле';
} else {
    echo 'Текст отсутствует';
}

Вариант: построчное чтение с fgets() - экономит память для больших файлов.

$handle = fopen('bigfile.log', 'r');
while (($line = fgets($handle)) !== false) {
    if (strpos($line, 'ERROR') !== false) {
        echo 'Строка с ошибкой: ' . $line;
        break;
    }
}
fclose($handle);

Вариант: использование регулярных выражений для сложного поиска (preg_match с флагом PREG_OFFSET_CAPTURE).

$content = file_get_contents('data.txt');
if (preg_match('/\d{4}-\d{2}-\d{2}/', $content, $match)) {
    echo 'Найдена дата: ' . $match[0];
}

Типичная ошибка: не проверить, что файл существует или доступен для чтения. file_get_contents() возвращает false при ошибке, что может привести к передаче false в strpos() и ошибке типа. Всегда проверяйте результат.

Проблема: кодировка файла может не совпадать с кодировкой строки поиска. Используйте mb_strpos() для многобайтовых строк.

Пример
// Пример 1: Поиск всех вхождений подстроки с подсчётом
$text = 'PHP это мощный язык. PHP популярен.';
$needle = 'PHP';
$lastPos = 0;
$positions = [];
while (($lastPos = strpos($text, $needle, $lastPos)) !== false) {
    $positions[] = $lastPos;
    $lastPos = $lastPos + strlen($needle);
}
echo 'Найдено вхождений: ' . count($positions) . ' на позициях: ' . implode(', ', $positions);
Найдено вхождений: 2 на позициях: 0, 22
Пример
// Пример 2: Поиск в многомерном массиве с array_filter
$users = [
    ['name' => 'Иван', 'city' => 'Москва'],
    ['name' => 'Петр', 'city' => 'СПб'],
    ['name' => 'Анна', 'city' => 'Москва']
];
$filtered = array_filter($users, function($user) {
    return $user['city'] === 'Москва';
});
foreach ($filtered as $u) {
    echo $u['name'] . "\n";
}
Иван
Анна
Пример
// Пример 3: Поиск в директории рекурсивно (файлы, содержащие определённую строку)
$directory = new RecursiveDirectoryIterator('./src');
$iterator = new RecursiveIteratorIterator($directory);
$pattern = 'TODO';
foreach ($iterator as $file) {
    if ($file->isFile() && $file->getExtension() === 'php') {
        $content = file_get_contents($file->getPathname());
        if (strpos($content, $pattern) !== false) {
            echo 'Найдено в: ' . $file->getPathname() . "\n";
        }
    }
}
Найдено в: /var/www/src/index.php
Найдено в: /var/www/src/lib/helper.php
Пример
// Пример 4: Поиск с игнорированием регистра с использованием preg_grep
$fruits = ['Apple', 'banana', 'Apricot'];
$result = preg_grep('/^a/i', $fruits); // все, начинающиеся с a или A
print_r($result);
Array
(
    [0] => Apple
    [2] => Apricot
)
Пример
// Пример 5: Использование array_udiff для поиска отсутствующих элементов
$expected = ['a', 'b', 'c'];
$actual = ['a', 'c'];
$missing = array_udiff($expected, $actual, 'strcmp');
print_r($missing); // ['b']
Array
(
    [1] => b
)

Поиск данных в PHP (общие методы) - comments

En
поиск данных php (php)