Змінюй хід війни! Допомагай ЗСУ!

Прошу помочь найти ошибку в программке на PHP

🟢 04:40 Відбій тривоги в м. Харків та Харківська територіальна громада.Слідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
Статус: Offline
Реєстрація: 05.09.2005
Повідом.: 386
  • 🟢 04:40 Відбій тривоги в м. Харків та Харківська територіальна громада.Слідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #1
Прошу помочь найти ошибку в программке на PHP

Код:
<?php 
$___notjson=1;
sleep( 0.05 );
if (empty($_GET['term'])) exit; // проверка есть ли что-либо в поле ввода, если нет - выход, если есть - продолжаем
$rss =  simplexml_load_file('export.xml'); // загрузка списка строк, в которых искать соответствие
$q = mb_strtolower($_GET["term"],'UTF-8'); // строка запроса для поиска соответствия (Введенная строка в нижнем регистре)
if (get_magic_quotes_gpc()) $q = stripslashes($q);
$query = explode(" ", mb_strtolower($q,'UTF-8') , 5); // разделение строки запроса на отдельные слова, формируется массив из максимум 5 слов
$result = array(); // результат

// цикл перебирает все строки из загруженного файла
foreach ($rss->channel->item  as $key) {   
	$namespaces = $key->getNameSpaces(true);
	$g = $key->children($namespaces['g']);
	
	$res=TRUE;  // признак выводить или не выводить этот запрос в список результатов. сначала ставим true 
	for ($x=0; $x<count($query); $x++){
	$res= $res and (stripos( mb_strtolower($key->title,'UTF-8'), mb_strtolower($query[$x],'UTF-8') ) !== false); // проверяем каждое слово на вхождение в исходную строку. Если все слова входят в строку, то признак $res останется True
	}

// если $res остался true, то результат заносится в массив результатов и потом выводится на экран другими средствами
	if ($res) {
    array_push($result, array("label"=>"{$key->title}", "img"=>"{$g->image_link}", "price"=>"{$g->price}", "url"=>"{$key->link}"));
	}

	if (count($result) > 5) // выводить максимум 6 найденных результатов, при превышении работа прерывается
		break;
}
echo json_encode($result);
?>

программка должна выполнять поиск в строке подстроки, состоящей из нескольких слов (заранее количество слов неизвестно, но ограничиваю максимумом 5). Слова подстроки могут меняться местами, но результат поиска должен остаться неизменным.

пример:
исходная строка: "один два три четыре пять шесть семь восемь"
что хотелось получить: строка поиска "пять один три" => строка вывода = исходной строке.
т.е. все слова из строки поиска, независимо от порядка ввода, нашлись в исходной строке и значит её нужно вывести в результатах поиска.
если хоть одно слово в сроке поиска лишнее, то не выводить ничего.

как работает: не отфильтровывает строки, в которые не входят искомые слова. выводит просто первые 6 попавшихся результатов из загруженного файла.



подскажите пожалуйста где тут ошибка. или как надо было сделать по-другому...
 
Останнє редагування:
  • 🟢 04:40 Відбій тривоги в м. Харків та Харківська територіальна громада.Слідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #2
и подскажите в чем разница между следующими конструкциями:

1)

Код:
	if (stripos( mb_strtolower($key->title,'UTF-8'), mb_strtolower($query[0],'UTF-8') ) !== false) {$res = 0;}
	}

 	if ($res == 1) { }
2)
Код:
	if (stripos( mb_strtolower($key->title,'UTF-8'), mb_strtolower($query[0],'UTF-8') ) !== false){ }
 
  • 🟢 04:40 Відбій тривоги в м. Харків та Харківська територіальна громада.Слідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #3
В 1-й конструкции - блок кода в пустых фигурных не выполнится, если условие истина. Во 2-й конструкции - наоборот.
А по поводу программы - неплохо бы сказать сразу, что не так работает.

Код:
$res= $res and (stripos( mb_strtolower($key->title,'UTF-8'), mb_strtolower($query[$x],'UTF-8') ) !== false);
Если мне не изменяет память у and меньше приоритет, чем у =. То есть $res будет всегда true. Нужно поставить наверное && вместо and. Правда я не спец по PHP, но вроде так;)
 
Останнє редагування:
  • 🟢 04:40 Відбій тривоги в м. Харків та Харківська територіальна громада.Слідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #4
по поводу программы - неплохо бы сказать сразу, что не так работает.


исправил первое сообщение, написал комментарии в коде и добавил пример чего хотелось бы получить и как получается по факту
 
  • 🟢 04:40 Відбій тривоги в м. Харків та Харківська територіальна громада.Слідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #5
Если мне не изменяет память у and меньше приоритет, чем у =. То есть $res будет всегда true. Нужно поставить наверное && вместо and. Правда я не спец по PHP, но вроде так;)


это кажется помогло..
поставил скобки в строке:
Код:
	$res = ($res and (stripos( mb_strtolower($key->title,'UTF-8'), mb_strtolower($query[$x],'UTF-8') ) !== false));

и стало работать, не идеально, но основная ошибка ушла
 
  • 🟢 04:40 Відбій тривоги в м. Харків та Харківська територіальна громада.Слідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #6
ieronymus
спасибо! поставить скобки для установки приоритета операций это как раз было то, что надо.
 
  • 🟢 04:40 Відбій тривоги в м. Харків та Харківська територіальна громада.Слідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #7
Да, можно и скобками. Пожалуйста!
 
Назад
Зверху Знизу