Добрый день. Я новичок в программировании, столкнулся с этим по работе. Потихоньку изучаю азы. Но мне уже сейчас нужно решить одну задачу. Есть файл Json, использую функцию PHP: $arrOutput = json_decode($objJsonDocument, TRUE); Получаю вот такое содержимое. Код (Text): Array ( [GetLowestOfferListingsForASINResult] => Array ( [@attributes] => Array ( [ASIN] => 3944628675 [status] => Success ) [AllOfferListingsConsidered] => false [Product] => Array ( [Identifiers] => Array ( [MarketplaceASIN] => Array ( [MarketplaceId] => A1PA6795UKMFR9 [ASIN] => 3944628675 ) ) [LowestOfferListings] => Array ( [LowestOfferListing] => Array ( [0] => Array ( [Qualifiers] => Array ( [ItemCondition] => Used [ItemSubcondition] => Mint [FulfillmentChannel] => Amazon [ShipsDomestically] => True [ShippingTime] => Array ( [Max] => 0-2 days ) [SellerPositiveFeedbackRating] => 98-100% ) [NumberOfOfferListingsConsidered] => 2 [SellerFeedbackCount] => 2907 [Price] => Array ( [LandedPrice] => Array ( [CurrencyCode] => EUR [Amount] => 21.42 ) [ListingPrice] => Array ( [CurrencyCode] => EUR [Amount] => 21.42 ) [Shipping] => Array ( [CurrencyCode] => EUR [Amount] => 0.00 ) ) [MultipleOffersAtLowestPrice] => True ) [1] => Array ( [Qualifiers] => Array ( [ItemCondition] => Used [ItemSubcondition] => Mint [FulfillmentChannel] => Merchant [ShipsDomestically] => True [ShippingTime] => Array ( [Max] => 0-2 days ) [SellerPositiveFeedbackRating] => 90-94% ) [NumberOfOfferListingsConsidered] => 1 [SellerFeedbackCount] => 96754 [Price] => Array ( [LandedPrice] => Array ( [CurrencyCode] => EUR [Amount] => 21.43 ) ) ) ) ) [ResponseMetadata] => Array ( [RequestId] => 67781c38-cdd4-48e9-a8f0-3012f61696cf ) ) В этом файле (возврате/ответе после json_decode) находятся 2 таких "отсека" Код (Text): [Price] => Array ( [LandedPrice] => Array ( [CurrencyCode] => EUR [Amount] => 21.42 ) [ListingPrice] => Array ( [CurrencyCode] => EUR [Amount] => 21.42 ) [Shipping] => Array ( [CurrencyCode] => EUR [Amount] => 0.00 ) ) Мне нужно получить все 2 значения только отсюда Код (Text): [LandedPrice] => Array ( [CurrencyCode] => EUR [Amount] => 21.42 ) и записать их столбиком в текстовой файл. Извиняюсь за такую простыню, я не знаю как тут можно скрыть сам код. Буду очень рад Вашей помощи.
PHP: $a = json_decode ( $objJsonDocument ); $LandedPrice = $a -> GetLowestOfferListingsForASINResult -> Product -> LowestOfferListings -> LowestOfferListing -> {0} -> Price -> LandedPrice; print_r ( $LandedPrice );
Огромное спасибо. То что мне нужно.!!))) У меня вопрос. А что делать если грубо говоря две таких почти одинаковых формы информации в файле? У меня получается тогда нужно сделать вот так $LandedPrice ]= $a -> GetLowestOfferListingsForASINResult -> [0] -> Product -> LowestOfferListings -> LowestOfferListing -> {0} -> Price -> LandedPrice; print_r ( $LandedPrice ); То что отмечено жирным шрифтом, это нужно получается менять в ручную? Например если у меня 20 таких блоков в файле (в примере был только один блок), то мне нужно писать для каждого 1,2,3,4 ... ? А можно ли как то сделать так, что бы было что то вроде знака "*" или, что бы было автоматическое определение сколько всего таких массивов (блоков) там будет.
Понимаю. Извиняюсь. Вот как поступить именно в этом случае ? Я загрузил файл. Смысл в том, что в первом примере делается один запрос и я получаю тот ответ. В текстовом файле пример того, что я получаю, когда делаю 2 запроса. И получается мне нужно сделать всё тоже самое, что и у Вас, но ещё добавить [0] после "GetLowestOfferListingsForASINResult". --- Добавлено --- Я загрузил файл.
PHP: foreach($arrOutput['GetLowestOfferListingsForASINResult']['0']['Product']['LowestOfferListings']['LowestOfferListing'] as $price) { echo $price['Price']['LandedPrice']['Amount'] . PHP_EOL; } foreach($arrOutput['GetLowestOfferListingsForASINResult']['1']['Product']['LowestOfferListings']['LowestOfferListing'] as $price1) { echo $price['Price']['LandedPrice']['Amount'] . PHP_EOL; } Проблема в том, что одна программа делает разное количество запросов и записывает их в текст. Если в текстовом файле один запрос (как в примере выше), то всё работает, но если больше одного, то мне надо постоянно узнавать сколько было запросов, что бы изменять [0] на [1] ...[17]. --- Добавлено --- Содержимое файла это ответ обработанный функцией $arrOutput = json_decode($objJsonDocument, TRUE);
PHP: foreach($arrOutput['GetLowestOfferListingsForASINResult'] as $value) ( if(isset($value['Product']['LowestOfferListings']['Price']['LandedPrice']['Amount'])) { echo $value['Product']['LowestOfferListings']['Price']['LandedPrice']['Amount'].'<br>'; } )
PHP: Исправил, вроде бы. foreach($arrOutput['GetLowestOfferListingsForASINResult'] as $value) { if(isset($value['Product']['LowestOfferListings']['Price']['LandedPrice']['Amount'])) { echo $value['Product']['LowestOfferListings']['Price']['LandedPrice']['Amount'].'<br>'; } }
Вот скрипт с которым я работаю. PHP: <?php libxml_use_internal_errors(TRUE); $objXmlDocument = simplexml_load_file("asin3.txt"); if ($objXmlDocument === FALSE) { echo "There were errors parsing the XML file.\n"; foreach(libxml_get_errors() as $error) { echo $error->message; } exit; } $objJsonDocument = json_encode($objXmlDocument); $arrOutput = json_decode($objJsonDocument, TRUE); foreach($arrOutput['GetLowestOfferListingsForASINResult']['0']['Product']['LowestOfferListings']['LowestOfferListing'] as $price) { echo $price['Price']['LandedPrice']['Amount'] . PHP_EOL; } foreach($arrOutput['GetLowestOfferListingsForASINResult']['1']['Product']['LowestOfferListings']['LowestOfferListing'] as $price1) { echo $price['Price']['LandedPrice']['Amount'] . PHP_EOL; } ?> Оригинальный файл я загрузил так же. Пришлось переделать расширение в тхт. так как xml загружать нельзя.
Так пойдет? PHP: <?php libxml_use_internal_errors(TRUE); $objXmlDocument = simplexml_load_file("asin3.txt"); $objXmlDocument->registerXPathNamespace('r', 'http://mws.amazonservices.com/schema/Products/2011-10-01'); if ($objXmlDocument === FALSE) { echo "There were errors parsing the XML file.\n"; foreach(libxml_get_errors() as $error) { echo $error->message; } exit; } $result = $objXmlDocument->xpath('//r:Price/r:LandedPrice'); echo '<pre>'; print_r($result); ?>
Xml как альтернатива пойдёт, но в дальнейшем я бы всё же хотел именно Json Этот вариант, тоже хороший и я скорее всего буду им пока пользоваться. Но он выдаёт всё ват такими блоками, мне нужно, что бы была только цена, так как она будет потом записываться в тхт столбиком. Код (Text): SimpleXMLElement Object ( [CurrencyCode] => EUR [Amount] => 20.86 )
Ну, так и обрабатывайте $result как вам надо Вот так вывод в столбик. PHP: foreach($result as $item) { echo $item[0].'<br>'; }
Я столкнулся со следующей проблемой. Смысл такой. Я посылаю номера (в данном случае это 3944628675 и 3470598770 ) одним куском, никогда не по одному. И получаю ответ, где на каждый номер цены в виде xml. Получается в этом случает у меня 2 Массива должно быть. Один с номерами, а другой с ценами. Вы все сделали правильно. Но в последствии я столкнулся с тем, что мне нужно записать это в текстовой файл в строку. Вот в таком виде. 3944628675 20.25 20.35 50.96 25.60 3944628675 30.25 50.34 6.2 20.40 Я понимаю, что задача изменилась, но я только столкнувшись понял, как именно должно быть. Помогите пожалуйста записать именно в таком виде.
Дайте образец кода, откуда вы берете "номера", из какой переменной\файла и тд, и как они связаны с полученным xml.
Это сторонняя программа, не скрипт. Она считывает номера (asin) из текстового файла , которые записаны в столбик 3809420239 3836262886 3955900509 3868736549 3830473079 (за один раз она берёт сразу 20 номеров, если номеров только 13, то отошлёт 13. В целях экономии времени программа никогда не посылает запросы по одному номеру, всегда пакетами, до 20 штук. Потом программа получает ответ в виде xml файла, я его тут загрузил "asin.txt". Вы с ним и работали (там был получен ответ на 2 номера/asin 3944628675, 3470598770). Всё остаётся тоже самое. Структура обычная Грубо говоря. [0] Asin Номер [0]цена [1]цена [2]цена [3]цена... [1] Asin Номер [0]цена [1]цена [2]цена ... А запись в текстовой файл должна выглядеть вот так 3944628675 20.25 20.35 50.96 25.60 3470598770 30.25 50.34 6.2 Количество цен к каждому номеру может быть разное.
Надо разобраться в ветках, правильно составить запрос, протестировать. Постараюсь в течении дня посмотреть.
PHP: <?php libxml_use_internal_errors(TRUE); $objXmlDocument = simplexml_load_file("asin2.xml"); $objXmlDocument->registerXPathNamespace('r', 'http://mws.amazonservices.com/schema/Products/2011-10-01'); if ($objXmlDocument === FALSE) { echo "There were errors parsing the XML file.\n"; foreach(libxml_get_errors() as $error) { echo $error->message; } exit; } $asins = array( 3809420239, 3836262886, 3955900509, 3868736549, 3830473079, 3944628675, 3470598770); echo '<pre>'; $out = array(); foreach($asins as $asin) { $query = sprintf('//r:Product[r:Identifiers/r:MarketplaceASIN/r:ASIN=%s]/*/*/r:Price/r:LandedPrice/r:Amount', $asin); $result = $objXmlDocument->xpath($query); if(isset($result[0])) { $str = $asin.' '; foreach($result as $item) { $str .= $item[0].' '; } $out[] = chop($str); } } print_r ($out); //file_put_contents( 'filename.txt', join(PHP_EOL, $out) ); ?> Примечание. Так как я не помню, как объединить ноды в одну выдачу, и поддерживается ли это вообще в версии для PHP, то запросы даны в цикле. Не знаю насколько это нагрузит с большим количеством итераций.