Master-X
Регистрация
|
Вход
Форум
|
Новости
|
Статьи
Главная
»
Форум
»
Программинг, Скрипты, Софт, Сервисы
»
Тема:
И сново пхп. написал код
Новая тема
Ответить
цитата
12/01/14 в 21:13
Lexikon
<?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% то его выводим отдельно, а все остальное как схожее.
Код написан, хотелось бы услышать мнение. Возможно сделал что то не так или всё не так, но оно работает. Интересно мнение специалистов.
цитата
12/01/14 в 21:25
Stek
Lexikon писал:
но оно работает. Интересно мнение специалистов
Работает ? Не трожь
Можно конечно написать по другому, начиная от контроля ошибок и до использования абстракций, но будет ли смысл ?
Я бы только с stristr искал. Просто по привычке старой.
цитата
12/01/14 в 22:02
Lexikon
Stek писал:
Я бы только с stristr искал.
хм, так это и разумней будет тогда можно убрать лишнюю функцию перевода в нижний регистр
Про ошибки понял, а вот про абстракции нет.
цитата
12/01/14 в 22:11
Lexikon
странно, может что то упускаю, заменил
$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, с маленькой всё гуд
цитата
12/01/14 в 23:07
Yacc
Если имена сохранить одной строкой через какой-нибудь нейтральный разделитель типа |, то задача поиска точного совпадения решается в три строки:
Код:
$names = file_get_contents('data.dat');
$search_query = 'Dulce Huels';
echo preg_match('/' . preg_quote($search_query) . '/', $names) ? $search_query : 'Not Found';
и по-меньшей мере раз в 5 быстрее перебора массива.
цитата
13/01/14 в 00:10
Stek
Lexikon писал:
Про ошибки понял, а вот про абстракции нет.
Абстрактные классы, наследования. Сейчас в пхп идет мания раздувания кода за счет "правильной структуры кода". При том даже там, где это нафиг не надо.
цитата
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 - мультистрочный поиск
цитата
16/01/14 в 17:37
AWD
Оборотень писал:
применить квалификатор g - мультистрочный поиск
жабаскриптом переигрался?
в пхп это m
цитата
16/01/14 в 17:47
AWD
а вообще, конечно, у ТС много буков
Код:
$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>";
Новая тема
Ответить
Эта страница в полной версии