🏠 | 💻 IT | Программирование Code | PHP |

json_decode PHP

Введение

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

Простейший JSON

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

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

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

var_dump(json_decode($json));

object(stdClass)#1 (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;

[{"1":{"number":"0","date":1597147003,"comment":"Продлили до 8 сентября ограничения на вьезд?","changes":-5,"author":"Игорь","url":"http:\/\/granitsa-online.com\/Pages\/Splash.aspx","last_comment":"Кто через торфянвоку едет, отпишитесь, как в целом по очередям? наши пускают граждан с двойным гражданством в Финку или до чего-то докапываются? Спасибо!","last_comment_author":"Александр","last_comment_date":1595499813,"waiting":0},"2":{"number":"3","date":1596348115,"comment":"Андрей у меня есть сыр и слив масло оптом. Сыры - 1200-1300 руб., слив масло - 700-900 руб. Звони +7 904 3371491","changes":-2,"author":"Водитель фуры","url":"http:\/\/granitsa-online.com\/Pages\/Splash.aspx","last_comment":"Внимание! По крайней мере до 11.08.2020 - граница закрыта(постановление правительства Финляндии). Не бузите! Пускают только ВНЖ, и оч серьёзная причина, которую надо доказать на границе документально.","last_comment_author":"Максим эксперт","last_comment_date":1594828966,"waiting":4},"3":{"number":"0","date":1596204849,"comment":"Куплю сыр из финки, килограммовый куски - Мильбона или из Призмы, за 700","changes":-3,"author":"Антон","url":"http:\/\/granitsa-online.com\/Pages\/Splash.aspx","last_comment":"Кого пускают то грузовые, по делам, или только у кого внж или двойное гражданство?","last_comment_author":"Юлия","last_comment_date":1596033022,"waiting":0},"4":{"number":"4","date":1597425394,"comment":"Прошли в 13:20 за 15 мин. Вопросов не было. Двойное гражд, русские номера. Сказали, что въехать мы снова можем в Россию, а выехать только после окончания карантина( 1 янв 2020) или снятия ограничений","changes":0,"author":"Татьяна Л","url":"","last_comment":"Кто едет 30.07-01.07 в Финку через бруснике, можете передать документы, там 2 листочка конверт не запечатан. За оплату","last_comment_author":"Юлия","last_comment_date":1596033576},"5":{"number":"1","date":1597162562,"comment":"Финны пускают если едешь с финским внж (B лупа)?","changes":-2,"author":"Pekka","url":"","last_comment":"Финны пускают если едешь с финским внж (B лупа)?","last_comment_author":"Pekka","last_comment_date":1597162527},"6":{"number":"5","date":1584625270,"comment":"Добрый У-ух пей сое флейринг на Бруснике и жди по 5 часов проехать обе границы","changes":1,"author":"Павел","url":"","last_comment":"Спасибо, мужчины!!! Не съездить к Финам, так хоть похихикать))) Павлу отдельное спасибо за кипешь)","last_comment_author":"Инна","last_comment_date":1584975321}},{"1":{"number":"3","date":1596989427,"comment":"У нас гражд.Швеции и России. Русские номера. Измерили темп, мы заполнили бланк, что въехали. Вещей с собой не было почти. Спрашивали нас про декларируемый товар","changes":0,"author":"Татьяна Л","url":"http:\/\/granitsa-online.com\/Pages\/Splash.aspx","last_comment":"Я тоже из Швеции номера шведские","last_comment_author":"Лина","last_comment_date":1596990521,"waiting":4},"2":{"number":"1","date":1596218647,"comment":"Антоха может тебе ещё таксфри дать ?","changes":1,"author":"Водитель Фуры","url":"http:\/\/granitsa-online.com\/Pages\/Splash.aspx","last_comment":"Пропускают на легковых? Есть кто проезжал? Найдите время дать ответ. Очень нужно...","last_comment_author":"оля","last_comment_date":1586265072,"waiting":2},"3":{"number":"6","date":1594109940,"comment":"","changes":3,"author":"granitsa-online.com","url":"http:\/\/granitsa-online.com\/Pages\/Splash.aspx","last_comment":"Лиза,позвоните на таможню,вы уже одно и тоже третий день спрашиваете.","last_comment_author":"Galina","last_comment_date":1584714680,"waiting":8},"4":{"number":"2","date":1596211648,"comment":"Ирина да есть, только подождите до февраль-март 2021 г.","changes":2,"author":"пограничник","url":"","last_comment":"Реально","last_comment_author":"Фантомас","last_comment_date":1585069860},"5":{"number":"0","date":1596213221,"comment":"Водитель фуры,800 максимум - это и так в 2,5 дороже. Плюс инвойс, если вы реально водитель","changes":-4,"author":"Антон","url":"","last_comment":"Водитель фуры, шоколадки Марабу по 150 купил бы","last_comment_author":"Антон","last_comment_date":1596213817},"6":{"number":"0","date":1588339479,"comment":"","changes":-70,"author":"Евгений","url":"","last_comment":"Приезжающих на карантин не отправляют?","last_comment_author":"Евгений","last_comment_date":1584430806}}]

Теперь применим 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(2) { [0]=> array(6) { [1]=> array(10) { ["number"]=> string(1) "0" ["date"]=> int(1597147003) ["comment"]=> string(80) "Продлили до 8 сентября ограничения на вьезд?" ["changes"]=> int(-5) ["author"]=> string(10) "Игорь" ["url"]=> string(44) "http://granitsa-online.com/Pages/Splash.aspx" ["last_comment"]=> string(278) "Кто через торфянвоку едет, отпишитесь, как в целом по очередям? наши пускают граждан с двойным гражданством в Финку или до чего-то докапываются? Спасибо!" ["last_comment_author"]=> string(18) "Александр" ["last_comment_date"]=> int(1595499813) ["waiting"]=> int(0) } [2]=> array(10) { ["number"]=> string(1) "3" ["date"]=> int(1596348115) ["comment"]=> string(169) "Андрей у меня есть сыр и слив масло оптом. Сыры - 1200-1300 руб., слив масло - 700-900 руб. Звони +7 904 3371491" ["changes"]=> int(-2) ["author"]=> string(25) "Водитель фуры" ["url"]=> string(44) "http://granitsa-online.com/Pages/Splash.aspx" ["last_comment"]=> string(356) "Внимание! По крайней мере до 11.08.2020 - граница закрыта(постановление правительства Финляндии). Не бузите! Пускают только ВНЖ, и оч серьёзная причина, которую надо доказать на границе документально." ["last_comment_author"]=> string(27) "Максим эксперт" ["last_comment_date"]=> int(1594828966) ["waiting"]=> int(4) } [3]=> array(10) { ["number"]=> string(1) "0" ["date"]=> int(1596204849) ["comment"]=> string(126) "Куплю сыр из финки, килограммовый куски - Мильбона или из Призмы, за 700" ["changes"]=> int(-3) ["author"]=> string(10) "Антон" ["url"]=> string(44) "http://granitsa-online.com/Pages/Splash.aspx" ["last_comment"]=> string(148) "Кого пускают то грузовые, по делам, или только у кого внж или двойное гражданство?" ["last_comment_author"]=> string(8) "Юлия" ["last_comment_date"]=> int(1596033022) ["waiting"]=> int(0) } [4]=> array(9) { ["number"]=> string(1) "4" ["date"]=> int(1597425394) ["comment"]=> string(346) "Прошли в 13:20 за 15 мин. Вопросов не было. Двойное гражд, русские номера. Сказали, что въехать мы снова можем в Россию, а выехать только после окончания карантина( 1 янв 2020) или снятия ограничений" ["changes"]=> int(0) ["author"]=> string(17) "Татьяна Л" ["url"]=> string(0) "" ["last_comment"]=> string(204) "Кто едет 30.07-01.07 в Финку через бруснике, можете передать документы, там 2 листочка конверт не запечатан. За оплату" ["last_comment_author"]=> string(8) "Юлия" ["last_comment_date"]=> int(1596033576) } [5]=> array(9) { ["number"]=> string(1) "1" ["date"]=> int(1597162562) ["comment"]=> string(84) "Финны пускают если едешь с финским внж (B лупа)?" ["changes"]=> int(-2) ["author"]=> string(5) "Pekka" ["url"]=> string(0) "" ["last_comment"]=> string(84) "Финны пускают если едешь с финским внж (B лупа)?" ["last_comment_author"]=> string(5) "Pekka" ["last_comment_date"]=> int(1597162527) } [6]=> array(9) { ["number"]=> string(1) "5" ["date"]=> int(1584625270) ["comment"]=> string(141) "Добрый У-ух пей сое флейринг на Бруснике и жди по 5 часов проехать обе границы" ["changes"]=> int(1) ["author"]=> string(10) "Павел" ["url"]=> string(0) "" ["last_comment"]=> string(174) "Спасибо, мужчины!!! Не съездить к Финам, так хоть похихикать))) Павлу отдельное спасибо за кипешь)" ["last_comment_author"]=> string(8) "Инна" ["last_comment_date"]=> int(1584975321) } } [1]=> array(6) { [1]=> array(10) { ["number"]=> string(1) "3" ["date"]=> int(1596989427) ["comment"]=> string(289) "У нас гражд.Швеции и России. Русские номера. Измерили темп, мы заполнили бланк, что въехали. Вещей с собой не было почти. Спрашивали нас про декларируемый товар" ["changes"]=> int(0) ["author"]=> string(17) "Татьяна Л" ["url"]=> string(44) "http://granitsa-online.com/Pages/Splash.aspx" ["last_comment"]=> string(59) "Я тоже из Швеции номера шведские" ["last_comment_author"]=> string(8) "Лина" ["last_comment_date"]=> int(1596990521) ["waiting"]=> int(4) } [2]=> array(10) { ["number"]=> string(1) "1" ["date"]=> int(1596218647) ["comment"]=> string(65) "Антоха может тебе ещё таксфри дать ?" ["changes"]=> int(1) ["author"]=> string(25) "Водитель Фуры" ["url"]=> string(44) "http://granitsa-online.com/Pages/Splash.aspx" ["last_comment"]=> string(149) "Пропускают на легковых? Есть кто проезжал? Найдите время дать ответ. Очень нужно..." ["last_comment_author"]=> string(6) "оля" ["last_comment_date"]=> int(1586265072) ["waiting"]=> int(2) } [3]=> array(10) { ["number"]=> string(1) "6" ["date"]=> int(1594109940) ["comment"]=> string(0) "" ["changes"]=> int(3) ["author"]=> string(19) "granitsa-online.com" ["url"]=> string(44) "http://granitsa-online.com/Pages/Splash.aspx" ["last_comment"]=> string(126) "Лиза,позвоните на таможню,вы уже одно и тоже третий день спрашиваете." ["last_comment_author"]=> string(6) "Galina" ["last_comment_date"]=> int(1584714680) ["waiting"]=> int(8) } [4]=> array(9) { ["number"]=> string(1) "2" ["date"]=> int(1596211648) ["comment"]=> string(95) "Ирина да есть, только подождите до февраль-март 2021 г." ["changes"]=> int(2) ["author"]=> string(22) "пограничник" ["url"]=> string(0) "" ["last_comment"]=> string(14) "Реально" ["last_comment_author"]=> string(16) "Фантомас" ["last_comment_date"]=> int(1585069860) } [5]=> array(9) { ["number"]=> string(1) "0" ["date"]=> int(1596213221) ["comment"]=> string(155) "Водитель фуры,800 максимум - это и так в 2,5 дороже. Плюс инвойс, если вы реально водитель" ["changes"]=> int(-4) ["author"]=> string(10) "Антон" ["url"]=> string(0) "" ["last_comment"]=> string(83) "Водитель фуры, шоколадки Марабу по 150 купил бы" ["last_comment_author"]=> string(10) "Антон" ["last_comment_date"]=> int(1596213817) } [6]=> array(9) { ["number"]=> string(1) "0" ["date"]=> int(1588339479) ["comment"]=> string(0) "" ["changes"]=> int(-70) ["author"]=> string(14) "Евгений" ["url"]=> string(0) "" ["last_comment"]=> string(71) "Приезжающих на карантин не отправляют?" ["last_comment_author"]=> string(14) "Евгений" ["last_comment_date"]=> int(1584430806) } } }

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

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"];

0
1597147003
Продлили до 8 сентября ограничения на вьезд?
-5
Игорь
0

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

Дата дана в формате 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"];

0
1588339479

-70
Евгений

Статьи о PHP
Программирование на PHP
Как отобразить время различных часовых поясов PHP
Как вставить переменную в ссылку PHP
Как получить ширину экрана с помощью PHP
Premature end of chunk coded message body: closing chunk expected

Если остались вопросы - смело задавайте их в комментариях.

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