Люблю то, что делаю!
С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418
|
Добавлено: 12/01/14 в 21:13 |
Код: [развернуть] | <?php
$data = file('data.dat');
$searchName = "keyword";
$searchName = preg_replace("/[^0-9A-Za-z]/", "", strtolower(trim($searchName)));
$startArr = array();
foreach ($data as $value) {
$pos = strpos($value, $searchName);
if ($pos !== false) {
$value = preg_replace("/[^0-9A-Za-z]/", "", $value);
if ($value === $searchName) {
$flag = 1;
}
else {
$flag = 0;
}
array_push($startArr, $value);
}
}
if ($flag === 1) {
echo $searchName;
}
else {
echo "NO Found!";
}
echo "<pre>";
print_r($startArr);
echo "</pre>";
?> |
Смысл кода:
есть список имен примерно 20к, все они записаны в файл с новой строки. Через поисковую форму осуществляем поиск к примеру Alex (регистронезависимый поиск) если в файле есть 100% совпадение, а так же слова, где содержится Alex то выводим и их. Но т.к. есть 100% то его выводим отдельно, а все остальное как схожее.
Код написан, хотелось бы услышать мнение. Возможно сделал что то не так или всё не так, но оно работает. Интересно мнение специалистов.
|
|
|
|
www.phpdevs.com
С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105
|
Добавлено: 12/01/14 в 21:25 |
Lexikon писал: | но оно работает. Интересно мнение специалистов |
Работает ? Не трожь
Можно конечно написать по другому, начиная от контроля ошибок и до использования абстракций, но будет ли смысл ?
Я бы только с stristr искал. Просто по привычке старой.
|
|
Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.
|
8
|
|
|
Люблю то, что делаю!
С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418
|
Добавлено: 12/01/14 в 22:02 |
Stek писал: | Я бы только с stristr искал. |
хм, так это и разумней будет тогда можно убрать лишнюю функцию перевода в нижний регистр
Про ошибки понял, а вот про абстракции нет.
|
|
|
|
Люблю то, что делаю!
С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418
|
Добавлено: 12/01/14 в 22:11 |
странно, может что то упускаю, заменил
Код: [развернуть] | $pos = strpos($value, $searchName); |
на
Код: [развернуть] | $pos = stristr($value, $searchName); |
и
Код: [развернуть] | $searchName = preg_replace("/[^0-9A-Za-z]/", "", strtolower(trim($searchName))); |
на
Код: [развернуть] | $searchName = preg_replace("/[^0-9A-Za-z]/", "", $searchName); |
при обращении с большой буквы, пишет Not Found, с маленькой всё гуд
|
|
|
|
С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 12/01/14 в 23:07 |
Если имена сохранить одной строкой через какой-нибудь нейтральный разделитель типа |, то задача поиска точного совпадения решается в три строки:
Код: | $names = file_get_contents('data.dat');
$search_query = 'Dulce Huels';
echo preg_match('/' . preg_quote($search_query) . '/', $names) ? $search_query : 'Not Found'; |
и по-меньшей мере раз в 5 быстрее перебора массива.
|
|
|
|
www.phpdevs.com
С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105
|
Добавлено: 13/01/14 в 00:10 |
Lexikon писал: | Про ошибки понял, а вот про абстракции нет. |
Абстрактные классы, наследования. Сейчас в пхп идет мания раздувания кода за счет "правильной структуры кода". При том даже там, где это нафиг не надо.
|
|
Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.
|
10
|
|
|
Я держусь там. Счастья мне, уд
С нами с 24.05.05
Сообщения: 16096
Рейтинг: 219
|
Добавлено: 16/01/14 в 17:14 |
Yacc писал: | Если имена сохранить одной строкой через какой-нибудь нейтральный разделитель типа |, то задача поиска точного совпадения решается в три строки:
Код: | $names = file_get_contents('data.dat');
$search_query = 'Dulce Huels';
echo preg_match('/' . preg_quote($search_query) . '/', $names) ? $search_query : 'Not Found'; |
и по-меньшей мере раз в 5 быстрее перебора массива. |
насчет быстрей не знаю, но можно и не объединять в одну строку а просто применить квалификатор g - мультистрочный поиск
|
|
Здесь не место для бесед: грохот на пределе
Как при старте ста ракет, как девятый вал
|
8
|
|
|
С нами с 03.02.11
Сообщения: 842
Рейтинг: 301
|
Добавлено: 16/01/14 в 17:37 |
Оборотень писал: | применить квалификатор g - мультистрочный поиск |
жабаскриптом переигрался?
в пхп это m
|
|
|
|
С нами с 03.02.11
Сообщения: 842
Рейтинг: 301
|
Добавлено: 16/01/14 в 17:47 |
а вообще, конечно, у ТС много буков Код: |
$data = file_get_contents('data.dat');
$search = strtolower('Alex');
$prec = array();
$other = array();
preg_match_all('~^.*'.preg_quote($search).'.*$~mi', $data, $m);
foreach($m[0] as $val) {
$val = trim($val);
if(strtolower($val) === $search)
$prec[] = $val; //собираем точные совпадения
else
$other[] = $val; //собираем, где просто есть совпадения
}
//ну а дальше
if(count($prec)) //eсли есть точные
foreach($prec as $val)
echo $val."<br>";
//ну и так же с неточными
if(count($other)) //eсли есть неточные
foreach($other as $val)
echo $val."<br>"; |
|
|
|
|