За последние 24 часа нас посетили 22945 программистов и 1230 роботов. Сейчас ищет 761 программист ...

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

Тема в разделе "PHP для новичков", создана пользователем kaufmanndk, 2 мар 2021.

  1. kaufmanndk

    kaufmanndk Новичок

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

    Есть файл 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.                                                         )
    и записать их столбиком в текстовой файл.

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

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Будет проще, если вы выгрузите куда-нибудь оригинальный файл.
     
  3. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    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 нравится это.
  4. kaufmanndk

    kaufmanndk Новичок

    С нами с:
    2 мар 2021
    Сообщения:
    32
    Симпатии:
    0
    Огромное спасибо. То что мне нужно.!!)))

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

    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 ... ? А можно ли как то сделать так, что бы было что то вроде знака "*" или, что бы было автоматическое определение сколько всего таких массивов (блоков) там будет.
     
    #4 kaufmanndk, 3 мар 2021
    Последнее редактирование: 3 мар 2021
  5. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    не знаю, ломать голову на гадании не хочу.
     
  6. kaufmanndk

    kaufmanndk Новичок

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

    Вложения:

    • 1primer.txt
      Размер файла:
      59,3 КБ
      Просмотров:
      4
  7. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Содержимое $objJsonDocument
     
  8. kaufmanndk

    kaufmanndk Новичок

    С нами с:
    2 мар 2021
    Сообщения:
    32
    Симпатии:
    0
    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);
     
  9. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    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. )
     
  10. kaufmanndk

    kaufmanndk Новичок

    С нами с:
    2 мар 2021
    Сообщения:
    32
    Симпатии:
    0
    [

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

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    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. }
     
  12. kaufmanndk

    kaufmanndk Новичок

    С нами с:
    2 мар 2021
    Сообщения:
    32
    Симпатии:
    0
    В этом случае к сожалению ничего не находит.
     
  13. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Вероятно потому, что нет правильного пути к выводимому.
    Нужен оригинальный json-файл
     
  14. kaufmanndk

    kaufmanndk Новичок

    С нами с:
    2 мар 2021
    Сообщения:
    32
    Симпатии:
    0

    Вот скрипт с которым я работаю.
    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 загружать нельзя.
     

    Вложения:

    • asin3.txt
      Размер файла:
      17 КБ
      Просмотров:
      2
  15. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Так пойдет?
    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 нравится это.
  16. kaufmanndk

    kaufmanndk Новичок

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

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

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

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    В xpath запросе измените на //r:price/r:LandedPrice/r:Amount
     
  18. kaufmanndk

    kaufmanndk Новичок

    С нами с:
    2 мар 2021
    Сообщения:
    32
    Симпатии:
    0
    Теперь выдаёт вот так.
    Код (Text):
    1. SimpleXMLElement Object
    2.  
    3. (
    4.     [0] => 21.05
    5. )
     
  19. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Ну, так и обрабатывайте $result как вам надо
    Вот так вывод в столбик.
    PHP:
    1. foreach($result as $item)
    2. {
    3. echo $item[0].'<br>';
    4. }
     
    kaufmanndk нравится это.
  20. kaufmanndk

    kaufmanndk Новичок

    С нами с:
    2 мар 2021
    Сообщения:
    32
    Симпатии:
    0
    Точно. Я просто только недавно столкнулся с программированием.
    Огромное Вам спасибо! Всё работает.!
     
  21. kaufmanndk

    kaufmanndk Новичок

    С нами с:
    2 мар 2021
    Сообщения:
    32
    Симпатии:
    0
    Я столкнулся со следующей проблемой.

    Смысл такой.

    Я посылаю номера (в данном случае это 3944628675 и 3470598770 ) одним куском, никогда не по одному. И получаю ответ, где на каждый номер цены в виде xml. Получается в этом случает у меня 2 Массива должно быть. Один с номерами, а другой с ценами.
    Вы все сделали правильно. Но в последствии я столкнулся с тем, что мне нужно записать это в текстовой файл в строку.
    Вот в таком виде.

    3944628675 20.25 20.35 50.96 25.60
    3944628675 30.25 50.34 6.2 20.40

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

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Дайте образец кода, откуда вы берете "номера", из какой переменной\файла и тд, и как они связаны с полученным xml.
     
  23. kaufmanndk

    kaufmanndk Новичок

    С нами с:
    2 мар 2021
    Сообщения:
    32
    Симпатии:
    0
    Это сторонняя программа, не скрипт.
    Она считывает номера (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

    Количество цен к каждому номеру может быть разное.
     

    Вложения:

    • asin3.txt
      Размер файла:
      17 КБ
      Просмотров:
      1
    #23 kaufmanndk, 4 мар 2021
    Последнее редактирование: 4 мар 2021
  24. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Надо разобраться в ветках, правильно составить запрос, протестировать.
    Постараюсь в течении дня посмотреть.
     
    kaufmanndk нравится это.
  25. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    PHP:
    1. <?php
    2. $objXmlDocument = simplexml_load_file("asin2.xml");
    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.  
    12. $asins = array(
    13. 3809420239,
    14. 3836262886,
    15. 3955900509,
    16. 3868736549,
    17. 3830473079,
    18. 3944628675,
    19. 3470598770);
    20.  
    21. echo '<pre>';
    22.  
    23. $out = array();
    24.  
    25. foreach($asins as $asin)
    26. {
    27.   $query = sprintf('//r:Product[r:Identifiers/r:MarketplaceASIN/r:ASIN=%s]/*/*/r:Price/r:LandedPrice/r:Amount', $asin);
    28.  
    29.   $result = $objXmlDocument->xpath($query);
    30.  
    31.      if(isset($result[0]))
    32.         {
    33.          $str = $asin.' ';
    34.           foreach($result as $item)
    35.            {
    36.            $str .= $item[0].' ';
    37.            }
    38.         $out[] = chop($str);
    39.         }
    40. }
    41.  
    42. print_r ($out);
    43.  
    44. //file_put_contents( 'filename.txt', join(PHP_EOL, $out) );
    45. ?>
    Примечание.
    Так как я не помню, как объединить ноды в одну выдачу, и поддерживается ли это вообще в версии для PHP, то запросы даны в цикле.
    Не знаю насколько это нагрузит с большим количеством итераций.
     
    #25 Drunkenmunky, 4 мар 2021
    Последнее редактирование: 4 мар 2021
    kaufmanndk нравится это.