В php файле таблица (разделители столбцов TAB'ы, а переход на др. строку "CRLF"): Цены URL Название товара Функция site.ru/123 Товар такой-то 214 ФУНКЦИИ ДОЛЖНЫ ВОЗВРАЩАТЬ ЦЕНЫ из <price>...</price>, если найден одинаковый URL из страницы site.ru/ceny с offer'ами: <offer id="123"> <url>site.ru/123</url> <price>4100</price> </offer> ... Для 1го товара URL совпал, => 4100 site.ru/123 Товар такой-то 214
Парсерщики, говорят, должны страдать. Но коль уж тут проблема с конкретным файлом, то почему бы не искать в нем ничего, а написать функцию, которая его растащит на массивы(2 строки, реально) и не бомбануть в БД это дело?
Похоже я буду страдать в двойне)) тк я и функцию не могу написать. Хотя что мне нужен именно парсер, я только на 5й день понял. В БД доступ есть, но это еще сложнее будет, чем просто вывести. Да и в нашей БД сайта нет URL - их формирует сайт как-то налету Нашел парсер, который по регулярке вытаскивает что нужно, но только 1-ую цену и без сравнения с URL: $text = file_get_contents( 'https://site.ru/ceny' ); preg_match( '/<price>(.*?)<\\/price>/is' , $text , $price ); echo $price[1];
сильно сомневаюсь @Voprosovich, вам проще всего нанять программиста, который достанет из БД всю информацию в надлежащем виде.
Файл источник - YML файл для яндекс маркет, он по типу XML и генерируется из самописной php с костылями, делающая запросы в БД. YML.php так же как-то генерит URL по тому же принципу что и сайт. В БД сайта 100% нет урлов, уже смотрел, но именно URL - единственный параметр для сбора таблицы. Сайт на древнем open cart - даже версию не показывает Вот что я придумал, найдя функцию сравнению без учета регистра strcasecmp(); Код (Text): function cenY (){ $text = file_get_contents( 'https://site.ru/ceny' ); preg_match( '/<price>(.*?)<\\/price>/is' , $text , $price ); $URL= "$price[1] - но это не правильно, тк только 1-ое найденная цена, а не все"; $URL1= "не знаю как адресовать к соседней ячейке таблицы отделенной только 1 ТАБом"; if (strcasecmp($URL, $URL1) == 0) : $cena = $price[1]; endif; echo $cena; } cenY(); cenY(); - как раз подставлять в таблицу ПС: только не пинайте больно, тк не программист.
Только не закрывайте пока тему, функция пока не работает тк я не знаю как собрать переменные URL для сравнения: $URL= "$price[1] - но это не правильно, тк только 1-ое найденная цена, а не все"; $URL1= "не знаю как адресовать к соседней ячейке таблицы отделенной только 1 ТАБом";
@Voprosovich Ничего не понял. Какие данные в каком формате... Но раз зашел лови разбирайся. https://php.ru/manual/function.str-getcsv.html https://php.ru/manual/function.simplexml-load-string.html
@nospiou Спасибо. Функция simplexml_load_string может работать и с YML разобрав в массив. Вот что я получаю (часть одного из offer's): Код (Text): [id] => 123 [type] => vendor.model [available] => true ) [url] => site.ru/123 [price] => 4100 [currencyId] => RUB По запросу: Код (Text): $string = file_get_contents( 'site.ru/ceny' ); $xml = simplexml_load_string($string); print_r($xml); Но как выводить только цены и урлы, отсеяв лишнее, чтобы потом по ним сравнивать и использовать цены?
PHP: foreach($items as $key => $item) { if ( $item['price'] === '......' && $item['url'] === '....') echo $key; }
Ошибка: Invalid argument supplied for foreach() :5 Не понимаю что значит ===, точки в кавычках и почему две переменные одинаковые $item
@Voprosovich Ну если и этого не понимаешь тогда дело плохо. Лучше на фриланс https://php.ru/manual/language.operators.comparison.html
Да, пока туповат. Дома почитаю, скажите, получу отфильтрованный список из массива с ценами и урлами, как дальше выполнять выборку и вывод цены на основе совпадающих URL (2й URL для сравнения лежит от функции справа через символ табуляции. Чтобы сразу читать так читать
Так вот о чем ты писал... PHP: $item['url'] === str_getcsv($str, "\t")[1] //или $item['url'] === explode($str, "\t")[1]
$text = file_get_contents( 'https://site.ru/ceny' ); preg_match_all( "#<price>(.*?)<\/price>#si' , $text , $result); вырежит все данные из тэгов price. print_r($result);
$string = file_get_contents( 'site.ru/ceny' ); $items = simplexml_load_string($string); print_r($items); выводит массив, где последний товар (всего их несколько тысяч): Код (Text): [626] => SimpleXMLElement Object ( [@attributes] => Array ( [id] => 61709 [type] => vendor.model [available] => true ) [url] => https://'site.ru/123123.html [price] => 5380 [currencyId] => RUB [categoryId] => 338 [market_category] => не назначена [picture] => https://site.ru/image/data/products/55e3c19c039c683354ea32a45ebed00c.jpg [description] => Предназначен для монтажа в тонкую стяжку, плиточный клей или наливной пол. [store] => true [pickup] => true [delivery] => true [delivery-options] => SimpleXMLElement Object ( [option] => SimpleXMLElement Object ( [@attributes] => Array ( [cost] => 200 [days] => 0-2 ) ) ) [typePrefix] => Комплект теплого пола [vendor] => CALEO [model] => EASYMAT 140-0.5-5,0 [sales_notes] => Выдаем дисконтную карту со скидкой до покупок. [param] => Array ( [0] => Россия [1] => кабель [2] => 5 [3] => 140 [4] => 220 [5] => 0.5 ) ) ) ) ) ) Почему тогда если продолжать писать: $res = array_keys(array_filter(array_count_values($items))); var_dump($res); выходит ошибка: Код (Text): NULL array_keys() expects parameter 1 to be array, null given :2 Вообще мне нужны цены и URL от сюда. Мб подскажете как их отсюда взять