Поиск значения в индексе массива PHP
Основные методы поиска темы в индексе PHP
Как найти ключ массива по его значению?
Решение с помощью array_search
Функция array_search ищет значение в массиве и возвращает соответствующий ключ. Если значение встречается несколько раз, возвращается первый найденный ключ.
$colors = ['red', 'green', 'blue', 'yellow'];
$key = array_search('green', $colors);
echo $key; // 1Search index php topic (поиск темы в индексе php)
1
Search php images (поиск изображений в php)
Для строгой проверки типа передается третий параметр true.
$numbers = ['1', 2, '3'];
$key = array_search(2, $numbers, true);
echo $key; // 1Posts php search (поиск постов в php)
1
Forum index php search (поиск на форуме (index) в php)
Распространенные проблемы:
- Возврат false, если значение не найдено. Следует использовать строгое сравнение (===) при проверке результата, так как ключ может быть 0, который приводится к false.
- При поиске в ассоциативных массивах возвращается строковый ключ.
Как проверить существование ключа в массиве?
Используется isset() или array_key_exists(). isset быстрее, но не различает ключ со значением null.
$data = ['name' => 'John', 'age' => null];
var_dump(isset($data['age'])); // false
var_dump(array_key_exists('age', $data)); // trueSearch php user (поиск пользователя в php)
bool(false) bool(true)
Catalogue php search (поиск по каталогу в php)
Ошибка: полагаться только на isset может привести к ложному отрицанию при нулевых значениях.
Как найти позицию подстроки в строке?
Функция strpos возвращает позицию первого вхождения подстроки (начиная с 0). Если не найдено, возвращает false.
$text = 'PHP поиск темы в индексе';
$pos = strpos($text, 'темы');
echo $pos; // 4Search php keywords (поиск по ключевым словам в php)
4
Search php mode search (режим поиска php)
Для поиска без учета регистра используется stripos.
Важно: при проверке результата использовать === false, так как позиция 0 означает совпадение в начале строки.
Как выполнить полнотекстовый поиск по базе данных?
MySQL поддерживает FULLTEXT индексы для MyISAM и InnoDB. Запрос с MATCH AGAINST.
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$stmt = $pdo->prepare('SELECT * FROM articles WHERE MATCH(title, content) AGAINST(:query IN BOOLEAN MODE)');
$stmt->execute(['query' => 'PHP поиск']);
$results = $stmt->fetchAll();
Ошибка: отсутствие FULLTEXT индекса приведет к ошибке. Также минимальная длина слова настраивается в my.cnf (ft_min_word_len). Для InnoDB требуется версия MySQL 5.6+.
Расширенные примеры поиска по индексу
Пример 1: Рекурсивный поиск значения в многомерном массиве
function recursiveArraySearch($needle, $haystack, &$path = []) {
foreach ($haystack as $key => $value) {
if (is_array($value)) {
$result = recursiveArraySearch($needle, $value, $path);
if ($result !== false) {
array_unshift($path, $key);
return $path;
}
} elseif ($value === $needle) {
array_unshift($path, $key);
return $path;
}
}
return false;
}
$data = [
'a' => ['x' => 1, 'y' => 2],
'b' => ['z' => 3, 'w' => ['inner' => 4]]
];
$path = recursiveArraySearch(4, $data);
print_r($path); // Array ( [0] => b [1] => w [2] => inner )
Array
(
[0] => b
[1] => w
[2] => inner
)
Пример 2: Поиск всех ключей, соответствующих значению (array_keys с параметром)
$array = ['apple', 'banana', 'apple', 'orange', 'apple'];
$keys = array_keys($array, 'apple');
print_r($keys); // [0, 2, 4]
Array
(
[0] => 0
[1] => 2
[2] => 4
)
Пример 3: Поиск с помощью array_filter для пользовательского условия
$products = [
['name' => 'Laptop', 'price' => 1000],
['name' => 'Mouse', 'price' => 20],
['name' => 'Keyboard', 'price' => 50]
];
$expensive = array_filter($products, function($item) {
return $item['price'] > 100;
});
print_r($expensive);
Array
(
[0] => Array
(
[name] => Laptop
[price] => 1000
)
)
Пример 4: Поиск строки в большом файле с построчным чтением
$filename = 'log.txt';
$search = 'error';
$lineNum = 0;
$handle = fopen($filename, 'r');
if ($handle) {
while (($line = fgets($handle)) !== false) {
$lineNum++;
if (strpos($line, $search) !== false) {
echo 'Найдено в строке ' . $lineNum . ': ' . $line;
}
}
fclose($handle);
}
Найдено в строке 10: [error] something happened Найдено в строке 25: [error] another error
Пример 5: Полнотекстовый поиск с релевантностью
$stmt = $pdo->prepare('SELECT *, MATCH(title, content) AGAINST(:query) AS relevance FROM articles WHERE MATCH(title, content) AGAINST(:query) ORDER BY relevance DESC');
$stmt->execute(['query' => 'PHP поиск']);
Результат: строки, отсортированные по убыванию релевантности, с дополнительным полем relevance.
Пример 6: Поиск всех вхождений подстроки с помощью preg_match_all
$text = 'PHP это язык, PHP популярен, PHP используется';
preg_match_all('/PHP/', $text, $matches, PREG_OFFSET_CAPTURE);
foreach ($matches[0] as $match) {
echo 'Найдено на позиции ' . $match[1] . '\n';
}
Найдено на позиции 0 Найдено на позиции 14 Найдено на позиции 28