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 писал:
но оно работает. Интересно мнение специалистов

Работает ? Не трожь smail101.gif

Можно конечно написать по другому, начиная от контроля ошибок и до использования абстракций, но будет ли смысл ?

Я бы только с stristr искал. Просто по привычке старой.
цитата
12/01/14 в 22:02
 Lexikon
Stek писал:
Я бы только с stristr искал.

icon_smile.gif
хм, так это и разумней будет тогда можно убрать лишнюю функцию перевода в нижний регистр

Про ошибки понял, а вот про абстракции нет.
цитата
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 быстрее перебора массива. icon_smile.gif
цитата
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 быстрее перебора массива. icon_smile.gif


насчет быстрей не знаю, но можно и не объединять в одну строку а просто применить квалификатор g - мультистрочный поиск icon_biggrin.gif
цитата
16/01/14 в 17:37
 AWD
Оборотень писал:
применить квалификатор g - мультистрочный поиск icon_biggrin.gif
жабаскриптом переигрался? smail101.gif
в пхп это 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>";


Эта страница в полной версии