Получить данные массива JSON из URL через PHP скрипт

142
17 декабря 2019, 13:40

Есть данные JSON(многомерный массив(больше трех вложенных друг в друга): https://api.trademc.org/Shop.getItems?shop=98603&v=3

{"response":{"categories":[{"id":0,"name":"Без категории","items":[{"id":382575,"type":0,"name":"test","cost":500,"description":"gertsthrsh","image":"https:\/\/i.trademc.org\/collections\/items\/_default.svg"},{"id":382576,"type":0,"name":"донат авто","cost":99999,"description":"кыеоек","image":"https:\/\/i.trademc.org\/collections\/items\/_default.svg"},{"id":382578,"type":0,"name":"487141","cost":99999,"description":"5115","image":"https:\/\/i.trademc.org\/collections\/items\/_default.svg"},{"id":382894,"type":2,"name":"банк деньги","cost":10,"description":"пыкеркрыепар","image":"https:\/\/i.trademc.org\/collections\/items\/_default.svg","game_currency_rate":10000,"fields":[{"id":"amount_of_item","placeholder":"Количество единиц валюты","flags":"d"}]},{"id":384358,"type":2,"name":"INFINITY COIN","cost":1,"description":"test by smozzy","image":"https:\/\/i.trademc.org\/shops\/2\/m\/2msY794p52.jpg","game_currency_rate":1024,"fields":[{"id":"amount_of_item","placeholder":"Количество единиц валюты","flags":"d"}]}]}]}}

Я делал так:

$strJsonFileContents = file_get_contents('https://api.trademc.org/Shop.getItems?shop=98603&v=3');
$array = json_decode($strJsonFileContents, true);
$array = array_shift($array);
$item0 = $array["categories"]["0"]["items"]["0"]["id"];
$item1 = $array["categories"]["0"]["items"]["1"]["id"];
$item2 = $array["categories"]["0"]["items"]["2"]["id"];
$item3 = $array["categories"]["0"]["items"]["3"]["id"];
$item4 = $array["categories"]["0"]["items"]["4"]["id"];

И все работало, но это ручной режим. И мне хотелось бы найти способ избирать данные из массива циклом, и если можно то желательно с пояснением, так как я новичок в PHP, просто ручная инициализация при малом количество товаров это не сложно, но когда товаров будет сотни, будут проблемы вписывать их в ручную.

Я задавал этот вопрос ранее, но в итоге, модератор посчитал что мой вопрос дубликат, и отправил сюда: Вывод данных циклом из json php

Я прошел по ссылке, попытался вникнуть и заметил то что в наших массивах есть отличия, такие как квадратные скобки [], мой массив их имеет, также он более многомерен, и он имеет неассоциацивные данные в том числе такие как [0],[1]

В итоге я сделал:

$url = 'https://api.trademc.org/Shop.getItems?shop=98603&v=3';
$jsonString = file_get_contents($url);      
$getcontent = json_decode( $jsonString );
    foreach ($getcontent->response->categories->items as $items) {
        $item_id = $items->id;
        $item_name = $items->name;
        echo 'Идентификатор - '.$item_id.'; Товар - '.$item_name.'<бр>';  
    }

В результате получил такой ответ:

Notice: Trying to get property of non-object in /var/www/u0664962/data/www/infinitymta.ru/php/donate.php on line 4
Warning: Invalid argument supplied for foreach() in /var/www/u0664962/data/www/infinitymta.ru/php/donate.php on line 4

Может быть кто-нибудь поможет новичку, укажет на то в чем ошибка?

Answer 1

В ошибке же всё указано. Trying to get property of non-object об этом $getcontent->response->categories->items. Происходит попытка обращения к элементу массива как к объекту и получения от него свойства (которого там естессно нет в таком виде)

Если перед запуском в цикл вы разпринтите $getcontent, то увидите структуру:

stdClass Object
(
[response] => stdClass Object
    (
        [categories] => Array
            (
                [0] => stdClass Object
                    (
                        [id] => 0
                        [name] => Без категории
                        [items] => Array
                            (
                                [0] => stdClass Object
                                    (
                                        [id] => 382575
                                        [type] => 0
                                        ...

Ваш foreach должен быть примерно таким:

foreach ($getcontent->response->categories[0]->items as $items) {

пример по вашему вопросу: http://sandbox.onlinephpfunctions.com/code/edc49bf69484312b6c10335d6363b18140eb9694

READ ALSO
fopen() Для создания .html файлов

fopen() Для создания .html файлов

для проекта делаю загрузку файлов с расширениемhtml

172
Не срабатывает подача запроса к функции

Не срабатывает подача запроса к функции

У меня имеется ссылка name_1 как осуществить запуск функции name('1'); Если я раскладываю приходящие данные через explode

134