2012-02-01 3 views
1

У меня есть файл csv, который анализируется и отображается. Я хочу сделать его доступным для поиска. Поэтому у меня есть форма, которая принимает пользовательский запрос и сравнивает его с массивом, чтобы найти совпадения. Теперь вот что у меня есть:Не удалось найти строку

foreach($last as $key=>$string) { 
    $hits[$key] = strpos(strtolower($string . " " . $first[$key] . " " . $middle[$key]), $query); 
} 

До этого небольшого фрагмента кода я заставляю $query снизить также.

Итак, в основном это объединяет полное имя Last First Middle и ищет каждый элемент массива для соответствия. Тогда, если $hits[$key] != false могу сказать, что там был матч. Поэтому я возвращаюсь и отображаю этот результат из основного массива имен. Надеюсь, это имеет смысл ...

Теперь с положительной стороны я получу много результатов, которые должны появиться. Например, если я найду jo, в списке появятся все фамилии Джонсона.

Проблема, с которой я столкнулась, - это результат, который не соответствует запросу или результатам, которые не отображаются, когда я знаю, что они находятся в списке имен. Поэтому я знаю, что smith john должен вернуть результат, но он вернется без каких-либо результатов.

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

ответ

4

strpos() функция возвращает индекс совпадающей подстроки, то есть он мог вернуться 0:

strpos('foo', 'f'); // 0 

Если подстрока не найдена, возвращается FALSE.

strpos('foo', 'z'); // FALSE 

Так как 0 и FALSE являются falsy значения (это означает, что они, как оценивают в булево FALSE), вам нужно будет использовать строгую проверку:

foreach($last as $key=>$string) { 
    $hits[$key] = strpos(strtolower($string . " " . $first[$key] . " " . $middle[$key]), $query) !== FALSE; 
} 

Обратите внимание на strpos(...) !== FALSE вместо того, чтобы просто strpos(...).

Edit (для @baudday):

Код:

<?php 
$query = strtolower('Michael'); 

$last = array('Baier', 'Baker', 'Baker', 'Banfield', 'Banks', 'Barber'); 
$first = array('Michael', 'Michael', 'Stephanie', 'Christopher', 'Joseph', 'David'); 
$middle = array('Joseph', 'Daniel', 'Nicole', 'Phillip', 'Andrew', 'Daniel'); 

foreach ($last as $key=>$string) { 
    $haystack = $string . " " . $first[$key] . " " . $middle[$key] . " " . $first[$key] . " " . $middle[$key] . " " . $last[$key] . " " . $first[$key] . " " . $string . " " . $middle[$key]; 
    $hits[$key] = strpos(strtolower($haystack), $query) !== false; 
} 

foreach ($hits as $key => $matches) { 
    if ($matches) { 
     echo $last[$key] . ', ' . $first[$key] . ' ' . $middle[$key] . ' (key: ' . $key . ") matches the query.\n"; 
    } 
} 

Выход:

Baier, Michael Joseph (key: 0) matches the query. 
Baker, Michael Daniel (key: 1) matches the query. 
+0

Эй удивительным! Таким образом, это облегчает проблему результатов, которые не появляются, когда я знаю, что они там. Другая проблема все еще происходит. Я ищу имя, и я получаю результаты, которые не содержат ничего даже близко к запросу. –

+0

@baudday: Мне нужен пример поиска и примеры данных, которые вы ищете, чтобы рассказать вам, почему это делается. – FtDRbwLXw6

+0

Хорошо, пробуйте эти имена отформатированы Последнее, первое среднее: Байер, Майкл Джозеф; Бейкер, Майкл Дэниел; Бейкер, Стефани Николь; Банфилд Кристофер Филлип; Банки, Джозеф Эндрю; Парикмахер, Дэвид Дэниел; Теперь найдите Майкла в этом списке. Он должен вернуть весь этот список. Отправьте мой поисковый код в отдельный комментарий. –

Смежные вопросы