Чтение Json в массив PHP

kaufmanndk

Добрый день.
Я новичок в программировании, столкнулся с этим по работе. Потихоньку изучаю азы.
Но мне уже сейчас нужно решить одну задачу.

Есть файл Json,
использую функцию

PHP:
  1. $arrOutput = json_decode($objJsonDocument, TRUE);

Получаю вот такое содержимое.

Код (Text):
  1. Array
  2. (
  3.     [GetLowestOfferListingsForASINResult] => Array
  4.         (
  5.             [@attributes] => Array
  6.                 (
  7.                     [ASIN] => 3944628675
  8.                     [status] => Success
  9.                 )
  10.  
  11.             [AllOfferListingsConsidered] => false
  12.             [Product] => Array
  13.                 (
  14.                     [Identifiers] => Array
  15.                         (
  16.                             [MarketplaceASIN] => Array
  17.                                 (
  18.                                     [MarketplaceId] => A1PA6795UKMFR9
  19.                                     [ASIN] => 3944628675
  20.                                 )
  21.  
  22.                         )
  23.  
  24.                     [LowestOfferListings] => Array
  25.                         (
  26.                             [LowestOfferListing] => Array
  27.                                 (
  28.                                     [0] => Array
  29.                                         (
  30.                                             [Qualifiers] => Array
  31.                                                 (
  32.                                                     [ItemCondition] => Used
  33.                                                     [ItemSubcondition] => Mint
  34.                                                     [FulfillmentChannel] => Amazon
  35.                                                     [ShipsDomestically] => True
  36.                                                     [ShippingTime] => Array
  37.                                                         (
  38.                                                             [Max] => 0-2 days
  39.                                                         )
  40.  
  41.                                                     [SellerPositiveFeedbackRating] => 98-100%
  42.                                                 )
  43.  
  44.                                             [NumberOfOfferListingsConsidered] => 2
  45.                                             [SellerFeedbackCount] => 2907
  46.                                             [Price] => Array
  47.                                                 (
  48.                                                     [LandedPrice] => Array
  49.                                                         (
  50.                                                             [CurrencyCode] => EUR
  51.                                                             [Amount] => 21.42
  52.                                                         )
  53.  
  54.                                                     [ListingPrice] => Array
  55.                                                         (
  56.                                                             [CurrencyCode] => EUR
  57.                                                             [Amount] => 21.42
  58.                                                         )
  59.  
  60.                                                     [Shipping] => Array
  61.                                                         (
  62.                                                             [CurrencyCode] => EUR
  63.                                                             [Amount] => 0.00
  64.                                                         )
  65.  
  66.                                                 )
  67.  
  68.                                             [MultipleOffersAtLowestPrice] => True
  69.                                         )
  70.  
  71.                                     [1] => Array
  72.                                         (
  73.                                             [Qualifiers] => Array
  74.                                                 (
  75.                                                     [ItemCondition] => Used
  76.                                                     [ItemSubcondition] => Mint
  77.                                                     [FulfillmentChannel] => Merchant
  78.                                                     [ShipsDomestically] => True
  79.                                                     [ShippingTime] => Array
  80.                                                         (
  81.                                                             [Max] => 0-2 days
  82.                                                         )
  83.  
  84.                                                     [SellerPositiveFeedbackRating] => 90-94%
  85.                                                 )
  86.  
  87.                                             [NumberOfOfferListingsConsidered] => 1
  88.                                             [SellerFeedbackCount] => 96754
  89.                                             [Price] => Array
  90.                                                 (
  91.                                                     [LandedPrice] => Array
  92.                                                         (
  93.                                                             [CurrencyCode] => EUR
  94.                                                             [Amount] => 21.43
  95.                                                         )
  96.                                  
  97.                                 )
  98.  
  99.                         )
  100.  
  101.                 )
  102.  
  103.         )
  104.  
  105.     [ResponseMetadata] => Array
  106.         (
  107.             [RequestId] => 67781c38-cdd4-48e9-a8f0-3012f61696cf
  108.         )
  109.  
  110. )

В этом файле (возврате/ответе после json_decode) находятся 2 таких «отсека»

Код (Text):
  1. [Price] => Array
  2.                                                 (
  3.                                                     [LandedPrice] => Array
  4.                                                         (
  5.                                                             [CurrencyCode] => EUR
  6.                                                             [Amount] => 21.42
  7.                                                         )
  8.  
  9.                                                     [ListingPrice] => Array
  10.                                                         (
  11.                                                             [CurrencyCode] => EUR
  12.                                                             [Amount] => 21.42
  13.                                                         )
  14.  
  15.                                                     [Shipping] => Array
  16.                                                         (
  17.                                                             [CurrencyCode] => EUR
  18.                                                             [Amount] => 0.00
  19.                                                         )
  20.  
  21.                                                 )

Мне нужно получить все 2 значения только отсюда

Код (Text):
  1. [LandedPrice] => Array
  2.                                                         (
  3.                                                             [CurrencyCode] => EUR
  4.                                                             [Amount] => 21.42
  5.                                                         )

и записать их столбиком в текстовой файл.

Извиняюсь за такую простыню, я не знаю как тут можно скрыть сам код.
Буду очень рад Вашей помощи.

 

Drunkenmunky

Будет проще, если вы выгрузите куда-нибудь оригинальный файл.

 

MouseZver

PHP:
  1. $a = json_decode ( $objJsonDocument );
  2.  
  3. $LandedPrice = $a -> GetLowestOfferListingsForASINResult
  4.     -> Product
  5.     -> LowestOfferListings
  6.     -> LowestOfferListing
  7.     -> {0}
  8.     -> Price
  9.     -> LandedPrice;
  10.  
  11. print_r ( $LandedPrice );
 

kaufmanndk

Огромное спасибо. То что мне нужно.!!)))

У меня вопрос. А что делать если грубо говоря две таких почти одинаковых формы информации в файле?
У меня получается тогда нужно сделать вот так

  1. $LandedPrice ]= $a -> GetLowestOfferListingsForASINResult
    -> [0]
  2. -> Product
  3. -> LowestOfferListings
  4. -> LowestOfferListing
  5. -> {0}
  6. -> Price
  7. -> LandedPrice;
  8. print_r ( $LandedPrice );

То что отмечено жирным шрифтом, это нужно получается менять в ручную? Например если у меня 20 таких блоков в файле (в примере был только один блок), то мне нужно писать для каждого 1,2,3,4 … ? А можно ли как то сделать так, что бы было что то вроде знака «*» или, что бы было автоматическое определение сколько всего таких массивов (блоков) там будет.

 

MouseZver

не знаю, ломать голову на гадании не хочу.

 

kaufmanndk

Понимаю. Извиняюсь.
Вот как поступить именно в этом случае ?
Я загрузил файл.
Смысл в том, что в первом примере делается один запрос и я получаю тот ответ. В текстовом файле пример того, что я получаю, когда делаю 2 запроса. И получается мне нужно сделать всё тоже самое, что и у Вас, но ещё добавить [0] после «GetLowestOfferListingsForASINResult».
— Добавлено —

Я загрузил файл.

 

Drunkenmunky

Содержимое $objJsonDocument

 

kaufmanndk

PHP:
  1. foreach($arrOutput[‘GetLowestOfferListingsForASINResult’][‘0’][‘Product’][‘LowestOfferListings’][‘LowestOfferListing’] as $price)
  2. {  
  3. echo $price[‘Price’][‘LandedPrice’][‘Amount’] . PHP_EOL;
  4. }
  5. foreach($arrOutput[‘GetLowestOfferListingsForASINResult’][‘1’][‘Product’][‘LowestOfferListings’][‘LowestOfferListing’] as $price1)
  6. {  
  7. echo $price[‘Price’][‘LandedPrice’][‘Amount’] . PHP_EOL;
  8. }

Проблема в том, что одна программа делает разное количество запросов и записывает их в текст. Если в текстовом файле один запрос (как в примере выше), то всё работает, но если больше одного, то мне надо постоянно узнавать сколько было запросов, что бы изменять [0] на [1] …[17].
— Добавлено —
Содержимое файла это ответ обработанный функцией $arrOutput = json_decode($objJsonDocument, TRUE);

 

Drunkenmunky

PHP:
  1. foreach($arrOutput[‘GetLowestOfferListingsForASINResult’] as $value)
  2. (
  3.   if(isset($value[‘Product’][‘LowestOfferListings’][‘Price’][‘LandedPrice’][‘Amount’]))
  4.    {
  5.     echo $value[‘Product’][‘LowestOfferListings’][‘Price’][‘LandedPrice’][‘Amount’].‘<br>’;
  6.    }
  7. )
 

kaufmanndk

[

К сожалению я получаю вот такую ошибку
Parse error: syntax error, unexpected ‘if’ (T_IF)

 

Drunkenmunky

PHP:
  1. Исправил, вроде бы.
  2. foreach($arrOutput[‘GetLowestOfferListingsForASINResult’] as $value)
  3. {
  4.   if(isset($value[‘Product’][‘LowestOfferListings’][‘Price’][‘LandedPrice’][‘Amount’]))
  5.    {
  6.     echo $value[‘Product’][‘LowestOfferListings’][‘Price’][‘LandedPrice’][‘Amount’].‘<br>’;
  7.    }
  8. }
 

kaufmanndk

В этом случае к сожалению ничего не находит.

 

Drunkenmunky

Вероятно потому, что нет правильного пути к выводимому.
Нужен оригинальный json-файл

 

kaufmanndk

Вот скрипт с которым я работаю.

PHP:
  1. <?php
  2. $objXmlDocument = simplexml_load_file(«asin3.txt»);
  3. if ($objXmlDocument === FALSE) {
  4.     echo «There were errors parsing the XML file.n«;
  5.     foreach(libxml_get_errors() as $error) {
  6.         echo $error->message;
  7.     }
  8.     exit;
  9. }
  10. $objJsonDocument = json_encode($objXmlDocument);
  11. $arrOutput = json_decode($objJsonDocument, TRUE);
  12.  
  13.  
  14.  
  15. foreach($arrOutput[‘GetLowestOfferListingsForASINResult’][‘0’][‘Product’][‘LowestOfferListings’][‘LowestOfferListing’] as $price)
  16. {  
  17. echo $price[‘Price’][‘LandedPrice’][‘Amount’] . PHP_EOL;
  18. }
  19. foreach($arrOutput[‘GetLowestOfferListingsForASINResult’][‘1’][‘Product’][‘LowestOfferListings’][‘LowestOfferListing’] as $price1)
  20. {  
  21. echo $price[‘Price’][‘LandedPrice’][‘Amount’] . PHP_EOL;
  22. }
  23.  
  24. ?>

Оригинальный файл я загрузил так же.
Пришлось переделать расширение в тхт. так как xml загружать нельзя.

 

Drunkenmunky

Так пойдет?

PHP:
  1. <?php
  2. $objXmlDocument = simplexml_load_file(«asin3.txt»);
  3. $objXmlDocument->registerXPathNamespace(‘r’, ‘http://mws.amazonservices.com/schema/Products/2011-10-01’);
  4. if ($objXmlDocument === FALSE) {
  5.     echo «There were errors parsing the XML file.n«;
  6.     foreach(libxml_get_errors() as $error) {
  7.         echo $error->message;
  8.     }
  9.     exit;
  10. }
  11. $result = $objXmlDocument->xpath(‘//r:Price/r:LandedPrice’);
  12. echo ‘<pre>’;
  13. print_r($result);
  14. ?>
 

kaufmanndk

Xml как альтернатива пойдёт, но в дальнейшем я бы всё же хотел именно Json
Этот вариант, тоже хороший и я скорее всего буду им пока пользоваться.

Но он выдаёт всё ват такими блоками, мне нужно, что бы была только цена, так как она будет потом записываться в тхт столбиком.

Код (Text):
  1. SimpleXMLElement Object
  2.  
  3. (
  4.     [CurrencyCode] => EUR
  5.     [Amount] => 20.86
  6. )
 

Drunkenmunky

В xpath запросе измените на //r:price/r:LandedPrice/r:Amount

 

kaufmanndk

Теперь выдаёт вот так.

Код (Text):
  1. SimpleXMLElement Object
  2.  
  3. (
  4.     [0] => 21.05
  5. )
 

Drunkenmunky

Ну, так и обрабатывайте $result как вам надо
Вот так вывод в столбик.

PHP:
  1. foreach($result as $item)
  2. {
  3. echo $item[0].‘<br>’;
  4. }
 

kaufmanndk

Точно. Я просто только недавно столкнулся с программированием.
Огромное Вам спасибо! Всё работает.!

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *