json_decode PHP

Содержание
Введение
Простейший JSON
JSON с одним вложением
JSON с массивом
Реальный пример работы с API
Похожие статьи

Введение

Попробуем разобраться с обработкой JSON средствами PHP

Простейший JSON

Предположим, что у нас есть следующий JSON

$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}'

Cделаем json_decode без дополнительных параметров

var_dump(json_decode($json));

object(stdClass)#4 (5) { ["a"]=> int(1) ["b"]=> int(2) ["c"]=> int(3) ["d"]=> int(4) ["e"]=> int(5) }

var_dump(json_decode($json, true));

array(5) { ["a"]=> int(1) ["b"]=> int(2) ["c"]=> int(3) ["d"]=> int(4) ["e"]=> int(5) }

В первом случае var_dump возвращает объект а во втором массив

$json_decode = json_decode($json); $json_decode_true = json_decode($json,true); echo $json_decode;

здесь ничего не получится вывести

echo $json_decode_true;

Array

Попробуем вытащить из массива отдельные элементы

echo $json_decode_true["a"]; echo'<br>; echo $json_decode_true["b"];

1
4

JSON с вложением

Усложним задачу. Пусть теперь JSON содержит вложения второго уровня.

$json2 = ' { "a":{"a_item_1":11,"a_item_2" : 12, "a_item_3" : 13}, "b":2,"c":3, "d":{"d_item_1":41,"d_item_2" : 42, "d_item_3" : 43},"e":5 }' ;

Попробуем достать один из вложенных элементов

$json_decode_true2 = json_decode($json2,true); echo $json_decode_true2["c"]; echo'<br>; echo $json_decode_true2["d"]; echo'<br>; echo $json_decode_true2["d"]["d_item_2"];

3
Array
42

Как Вы можете видеть, обычные элементы по-прежнему доступны. Новые элементы возвращают Array если обратиться к верхнему уровню, либо значение, если обратиться к элементу массива.

JSON с массивом

Массивы заключены в квадратные скобки. Предположим, что он довольно простой.

{ "a": [{ "a_item_1": 11, "a_item_2": 12, "a_item_3": 13 }, { "a_item_4": 14, "a_item_5": 15, "a_item_6": 16 } ], "b": 2, "c": 3, "d": { "d_item_1": 41, "d_item_2": 42, "d_item_3": 43 }, "e": 5 }

Чтобы обратиться к элементу массива нужно сперва указать его индекс в квадратных скобках.

Достанем по элементу из первой части массива {"a_item_1":11,"a_item_2" : 12, "a_item_3" : 13} и из второй {"a_item_4":14,"a_item_5" : 15, "a_item_6" : 16}

Ожидаем получить 13 и 16

$json_decode_true3 = json_decode($json3, true); echo $json_decode_true3["a"]; echo'<br>; echo $json_decode_true3["a"][0]["a_item_3"]; echo'<br>; echo $json_decode_true3["a"][1]["a_item_6"];

Array
13
16

Реальный пример

Сайту HeiHei.ru нужно получить информацию о пробках на границе с Финляндией.

Для этого он обращается к API сайта narganitse.ru. Который выглядит следующим образом

[ { // Из России "1": { // Торфяновка "number": "12", // Число машин "date": 1325513571, // UNIX-время, когда было получено сообщение "comment": "", // Комментарий "changes": -11, // Изменение относительно предыдущего сообщения "author": "test", // Имя автора комментария "url": "", "waiting": 15 // Примерное время ожидания }, "2": { // Брусничное "number": "0", "date": 1303291117, "comment": "", "changes": -55, "author": "***0606", "url": "", "waiting": 0 }, "3": { // Светогорск "number": "35", "date": 1303287127, "comment": "машин не много: 30-35. только подъехали и пока стоим.", "changes": -20, "author": "Explorer002", "url": "", "waiting": 42 } }, { // В Россию "1": { "number": "13", "date": "1326638542", "comment": "", "changes": -32, "author": "***2117", "url": "", "waiting": 16 }, "2": { "number": "60", "date": 1303294658, "comment": "", "changes": 40, "author": "granitsa-online.com", "url": "http://granitsa-online.com", "waiting": 72 }, "3": { "number": "0", "date": 1303279308, "comment": "", "changes": -12, "author": "Logan", "url": "", "waiting": 0 } } ]

Этот API актуален по крайней мере на февраль 2020-го года. Последняя версия доступна на сайте

$api_address = "http://api.nagranitse.ru/data.json"; $json_border = file_get_contents($api_address);

Посмотрим, как выглядит необработанный JSON, который мы получили от API.

echo $json_border;

{"0":{"1":{"number":"40","date":1673187340,"comment":"Три часа стоять до въезда на саму границу. Что за бардак не понятно на границе РФ не понятно","changes":30,"author":"Виталий","url":"","last_comment":"Очередь перед финами","last_comment_author":"РТ","last_comment_date":1676382785,"traffic":null,"waiting":48},"2":{"number":"1","date":1665849031,"comment":"Отдельно для Маруси ! Если официальное разъяснение на рая.фи для вас вранье - езжайте смело. Таких как вы там финские пограничники очень рады видеть, но не долго.))","changes":-4,"author":"Читатель Бредов","url":"","last_comment":"С детьми владельцу недвижимости тоже нельзя, детям визы анулируют","last_comment_author":"Татьяна","last_comment_date":1664628584,"traffic":null,"waiting":2},"3":{"number":"0","date":1665654327,"comment":"","changes":-2,"author":"","url":"","last_comment":"нет свежих данных","last_comment_author":"","last_comment_date":1665173066,"traffic":null,"waiting":0},"4":{"number":"1","date":1664744537,"comment":"Поехали лугандоны. Достали украинские номера","changes":0,"author":"Убейдед","url":"","last_comment":"Если есть основания: учёба, недвижимость, или родственники","last_comment_author":"Антон","last_comment_date":1664528537,"traffic":null},"5":{"number":"5","date":1665172807,"comment":"","changes":4,"author":"","url":"","last_comment":"Пускают по туристической?","last_comment_author":"РК","last_comment_date":1664487907,"traffic":null},"6":{"number":"2","date":1666795913,"comment":"Вяртсиля, 1 машина на российской стороне, у финнов никого. Смысл ждать у Торфяновки и Брусничное не вижу, здесь всё очень быстро","changes":-8,"author":"Павел","url":"","last_comment":"Svetofora тоже не слушайте, он муд.к классный....2 года назад постоянно спрашивал как там на таможне - проверят или нет...","last_comment_author":"Павел","last_comment_date":1664548179,"traffic":null}},"1":{"1":{"number":"30","date":1677427175,"comment":"Ждём уже 2 часа на русской границе\/таможне, финов прошли за 15 минут.","changes":-20,"author":"Андрей","url":"","last_comment":"Очередь в рф организована на нашем кпп. Финны поэтотум не пускают","last_comment_author":"Алексей","last_comment_date":1664743981,"traffic":null,"waiting":36},"2":{"number":"3","date":1666786907,"comment":"","changes":2,"author":"yury","url":"","last_comment":"Полчаса обе границы, фины не смотрели, наши проверяли сумки и запаску.","last_comment_author":"Анна","last_comment_date":1664185572,"traffic":null,"waiting":4},"3":{"number":"4","date":1669641671,"comment":"Финов прошли за 3 мин, наши тормозят","changes":-3,"author":"Михаил","url":"","last_comment":"никого.супер","last_comment_author":"Алексей","last_comment_date":1666720771,"traffic":null,"waiting":5},"4":{"number":"50","date":1669996380,"comment":"","changes":50,"author":"","url":"","last_comment":"За 1.10 продвинулись машин на 15, наверное. Очень медленно(( надо было на бруснику ехать","last_comment_author":"Алина","last_comment_date":1664639885,"traffic":null},"5":{"number":"1","date":1664729757,"comment":"Никого нет!!!","changes":0,"author":"Rispen","url":"","last_comment":"Число машин","last_comment_author":"Елена","last_comment_date":1664726436,"traffic":null},"6":{"number":"1","date":1664716928,"comment":"Машин нет, всё чудесно","changes":-7,"author":"Анастасия","url":"","last_comment":"На российской границе уже 1.5 часа стоим","last_comment_author":"Андрей","last_comment_date":1664133746,"traffic":null}},"":{"2":{"number":"1","traffic":null,"date":1663871951,"comment":"мне вот интересно - куда ломятся и на что надеятся те, у кого нет своей хаты в Финляндии ? нет кредиток работающих в Европе ? отсидеть максимум 90 дней и спустить всю наличку за жилье и еду ? а дальше то что???","author":"Неврубальский из ЕС"},"4":{"traffic":null,"last_comment":"Стоим в финском пункте пропуска 4 часа. Начали пускать на контроль. Видим, что разворачивают обратно.","last_comment_author":"Александр","last_comment_date":1664504992}}}

Теперь применим json_decode

$border_obj = json_decode($json_border,true);

Убедимся, что это массив.

echo $border_obj;

Array

И посмотрим содержимое. С помощью

var_dump($border_obj);

Массив содержит два вложенных массива - это мы видим из array(2) в самом начале.

Первый найти легко: [0]=> array(6)

Второй начинается в середине: [1]=> array(6)

array(3) { [0]=> array(6) { [1]=> array(11) { ["number"]=> string(2) "40" ["date"]=> int(1673187340) ["comment"]=> string(166) "Три часа стоять до въезда на саму границу. Что за бардак не понятно на границе РФ не понятно" ["changes"]=> int(30) ["author"]=> string(14) "Виталий" ["url"]=> string(0) "" ["last_comment"]=> string(38) "Очередь перед финами" ["last_comment_author"]=> string(4) "РТ" ["last_comment_date"]=> int(1676382785) ["traffic"]=> NULL ["waiting"]=> int(48) } [2]=> array(11) { ["number"]=> string(1) "1" ["date"]=> int(1665849031) ["comment"]=> string(296) "Отдельно для Маруси ! Если официальное разъяснение на рая.фи для вас вранье - езжайте смело. Таких как вы там финские пограничники очень рады видеть, но не долго.))" ["changes"]=> int(-4) ["author"]=> string(29) "Читатель Бредов" ["url"]=> string(0) "" ["last_comment"]=> string(121) "С детьми владельцу недвижимости тоже нельзя, детям визы анулируют" ["last_comment_author"]=> string(14) "Татьяна" ["last_comment_date"]=> int(1664628584) ["traffic"]=> NULL ["waiting"]=> int(2) } [3]=> array(11) { ["number"]=> string(1) "0" ["date"]=> int(1665654327) ["comment"]=> string(0) "" ["changes"]=> int(-2) ["author"]=> string(0) "" ["url"]=> string(0) "" ["last_comment"]=> string(32) "нет свежих данных" ["last_comment_author"]=> string(0) "" ["last_comment_date"]=> int(1665173066) ["traffic"]=> NULL ["waiting"]=> int(0) } [4]=> array(10) { ["number"]=> string(1) "1" ["date"]=> int(1664744537) ["comment"]=> string(83) "Поехали лугандоны. Достали украинские номера" ["changes"]=> int(0) ["author"]=> string(14) "Убейдед" ["url"]=> string(0) "" ["last_comment"]=> string(107) "Если есть основания: учёба, недвижимость, или родственники" ["last_comment_author"]=> string(10) "Антон" ["last_comment_date"]=> int(1664528537) ["traffic"]=> NULL } [5]=> array(10) { ["number"]=> string(1) "5" ["date"]=> int(1665172807) ["comment"]=> string(0) "" ["changes"]=> int(4) ["author"]=> string(0) "" ["url"]=> string(0) "" ["last_comment"]=> string(47) "Пускают по туристической?" ["last_comment_author"]=> string(4) "РК" ["last_comment_date"]=> int(1664487907) ["traffic"]=> NULL } [6]=> array(10) { ["number"]=> string(1) "2" ["date"]=> int(1666795913) ["comment"]=> string(231) "Вяртсиля, 1 машина на российской стороне, у финнов никого. Смысл ждать у Торфяновки и Брусничное не вижу, здесь всё очень быстро" ["changes"]=> int(-8) ["author"]=> string(10) "Павел" ["url"]=> string(0) "" ["last_comment"]=> string(206) "Svetofora тоже не слушайте, он муд.к классный....2 года назад постоянно спрашивал как там на таможне - проверят или нет..." ["last_comment_author"]=> string(10) "Павел" ["last_comment_date"]=> int(1664548179) ["traffic"]=> NULL } } [1]=> array(6) { [1]=> array(11) { ["number"]=> string(2) "30" ["date"]=> int(1677427175) ["comment"]=> string(121) "Ждём уже 2 часа на русской границе/таможне, финов прошли за 15 минут." ["changes"]=> int(-20) ["author"]=> string(12) "Андрей" ["url"]=> string(0) "" ["last_comment"]=> string(119) "Очередь в рф организована на нашем кпп. Финны поэтотум не пускают" ["last_comment_author"]=> string(14) "Алексей" ["last_comment_date"]=> int(1664743981) ["traffic"]=> NULL ["waiting"]=> int(36) } [2]=> array(11) { ["number"]=> string(1) "3" ["date"]=> int(1666786907) ["comment"]=> string(0) "" ["changes"]=> int(2) ["author"]=> string(4) "yury" ["url"]=> string(0) "" ["last_comment"]=> string(127) "Полчаса обе границы, фины не смотрели, наши проверяли сумки и запаску." ["last_comment_author"]=> string(8) "Анна" ["last_comment_date"]=> int(1664185572) ["traffic"]=> NULL ["waiting"]=> int(4) } [3]=> array(11) { ["number"]=> string(1) "4" ["date"]=> int(1669641671) ["comment"]=> string(64) "Финов прошли за 3 мин, наши тормозят" ["changes"]=> int(-3) ["author"]=> string(12) "Михаил" ["url"]=> string(0) "" ["last_comment"]=> string(23) "никого.супер" ["last_comment_author"]=> string(14) "Алексей" ["last_comment_date"]=> int(1666720771) ["traffic"]=> NULL ["waiting"]=> int(5) } [4]=> array(10) { ["number"]=> string(2) "50" ["date"]=> int(1669996380) ["comment"]=> string(0) "" ["changes"]=> int(50) ["author"]=> string(0) "" ["url"]=> string(0) "" ["last_comment"]=> string(153) "За 1.10 продвинулись машин на 15, наверное. Очень медленно(( надо было на бруснику ехать" ["last_comment_author"]=> string(10) "Алина" ["last_comment_date"]=> int(1664639885) ["traffic"]=> NULL } [5]=> array(10) { ["number"]=> string(1) "1" ["date"]=> int(1664729757) ["comment"]=> string(22) "Никого нет!!!" ["changes"]=> int(0) ["author"]=> string(6) "Rispen" ["url"]=> string(0) "" ["last_comment"]=> string(21) "Число машин" ["last_comment_author"]=> string(10) "Елена" ["last_comment_date"]=> int(1664726436) ["traffic"]=> NULL } [6]=> array(10) { ["number"]=> string(1) "1" ["date"]=> int(1664716928) ["comment"]=> string(40) "Машин нет, всё чудесно" ["changes"]=> int(-7) ["author"]=> string(18) "Анастасия" ["url"]=> string(0) "" ["last_comment"]=> string(71) "На российской границе уже 1.5 часа стоим" ["last_comment_author"]=> string(12) "Андрей" ["last_comment_date"]=> int(1664133746) ["traffic"]=> NULL } } [""]=> array(2) { [2]=> array(5) { ["number"]=> string(1) "1" ["traffic"]=> NULL ["date"]=> int(1663871951) ["comment"]=> string(370) "мне вот интересно - куда ломятся и на что надеятся те, у кого нет своей хаты в Финляндии ? нет кредиток работающих в Европе ? отсидеть максимум 90 дней и спустить всю наличку за жилье и еду ? а дальше то что???" ["author"]=> string(36) "Неврубальский из ЕС" } [4]=> array(4) { ["traffic"]=> NULL ["last_comment"]=> string(183) "Стоим в финском пункте пропуска 4 часа. Начали пускать на контроль. Видим, что разворачивают обратно." ["last_comment_author"]=> string(18) "Александр" ["last_comment_date"]=> int(1664504992) } } }

Достанем количество машин, дату, комментарий, изменение количества, автора, и время ожидания присланые пользователем на выезде из России через Торфяновку

echo $border_obj[0][1]["number"]; echo $border_obj[0][1]["date"]; echo $border_obj[0][1]["comment"]; echo $border_obj[0][1]["changes"]; echo $border_obj[0][1]["author"]; echo $border_obj[0][1]["waiting"];

40
1673187340
Три часа стоять до въезда на саму границу. Что за бардак не понятно на границе РФ не понятно
30
Виталий
48

Комментарий пуст.

Дата дана в формате epoch time. Подробнее можете прочитать в моей статье Epoch Time

Теперь повторим, но для Светогорска и на въезд в Россиию

echo $border_obj[1][6]["number"]; echo $border_obj[1][6]["date"]; echo $border_obj[1][6]["comment"]; echo $border_obj[1][6]["changes"]; echo $border_obj[1][6]["author"]; echo $border_obj[1][6]["waiting"];

1
1664716928
Машин нет, всё чудесно
-7
Анастасия

Похожие статьи
Программирование на PHP
Массивы в PHP
Циклы в PHP
Дата и время в PHP - основы
Как отобразить время различных часовых поясов PHP
Как вставить переменную в ссылку PHP
gettype(): определить тип переменной PHP
json_decode
Как получить ширину экрана с помощью PHP
Вызов функции из другого файла
Premature end of chunk coded message body: closing chunk expected
Сгенерировать неповторяющиеся случайные числа PHP
Узнать свой HTTP_USER_AGENT
Сравнить две даты
Классы в PHP 8
Комментарии в PHP
substr: обрезать строку
Запросы к REST API на PHP
$_SERVER['REQUEST_URI']: текущая url
Работа с базами данных
Работа с cookies
PHP sessions
Аутентификация и авторизация в PHP 8
Тернарный оператор
try catch

Поиск по сайту

Подпишитесь на Telegram канал @aofeed чтобы следить за выходом новых статей и обновлением старых

Перейти на канал

@aofeed

Задать вопрос в Телеграм-группе

@aofeedchat

Поиск по сайту

Подпишитесь на Telegram канал @aofeed чтобы следить за выходом новых статей и обновлением старых

Перейти на канал

@aofeed

Задать вопрос в Телеграм-группе

@aofeedchat

Контакты и сотрудничество:
Рекомендую наш хостинг beget.ru
Пишите на info@eth1.ru если Вы:
1. Хотите написать статью для нашего сайта или перевести статью на свой родной язык.
2. Хотите разместить на сайте рекламу, подходящуюю по тематике.
3. Реклама на моём сайте имеет максимальный уровень цензуры. Если Вы увидели рекламный блок недопустимый для просмотра детьми школьного возраста, вызывающий шок или вводящий в заблуждение - пожалуйста свяжитесь с нами по электронной почте
4. Нашли на сайте ошибку, неточности, баг и т.д. ... .......
5. Статьи можно расшарить в соцсетях, нажав на иконку сети: