🏠 | 💻 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;

{"0":{"1":{"number":"10","date":1610441400,"comment":"Машин не мого но задержка по времени есть у погранцов перед палкой стою 1ч 30 мин","changes":-10,"author":"Ишорь","url":"","last_comment":"Доброй дороги всем.Буду возвращаться в Финляндию на основании трудового договора. Нужен ли перевод? Спасибо.","last_comment_author":"Нина","last_comment_date":1604728739,"waiting":12},"2":{"number":"1","date":1608655613,"comment":"Ну слава богу "в гостях у сказки не закрыли ". зашевелился муравейник . Всем добра.","changes":0,"author":"Ватанен","url":"","last_comment":"Финский не у дачник решил имя сменить!) шифруется !)","last_comment_author":"Алексей","last_comment_date":1608576315,"waiting":2},"3":{"number":"0","date":1596204849,"comment":"Куплю сыр из финки, килограммовый куски - Мильбона или из Призмы, за 700","changes":-3,"author":"Антон","url":"","last_comment":"А кто не пускает? фины или наши?","last_comment_author":"Димас","last_comment_date":1606389029,"waiting":0},"4":{"number":"10","date":1606814988,"comment":"","changes":8,"author":"Rekka","url":"","last_comment":"Требуют ли погранцы тест на коронавирус с отрицательным результатом?","last_comment_author":"Дима","last_comment_date":1603370022},"5":{"number":"1","date":1601929549,"comment":"Тоже очень ждём инфо! Впускают только самих владельцев? Квартира оформлена на маму-пенсионерку, одна она не справится. Напишите, кто проехал!","changes":1,"author":"Маргарита","url":"","last_comment":"Мои друзья звонили в русскую вет. службу Иматра. Русские выпускают со справкой и документами на недвижимость. Финам этого тоже достаточно. Хочу реальных подтвеждений.","last_comment_author":"Игорь","last_comment_date":1601908944},"6":{"number":"2","date":1606678117,"comment":"Вяртсиля - Нийрала , обе границы за 10-12 мин, с Питера До Вяртсиля - 3 чача 55 мин по навигатору, дорога шикардось, просто сказка.Павел","changes":-3,"author":"Махараджа","url":"","last_comment":"Не удачник! Буду выезжать 11.11 из Иматры в РФ. Ну очень хочется встретиться с тобой . Посмотреть кто прячется за этим скупым названием) Принимаешь вызов?","last_comment_author":"Максим","last_comment_date":1604687112}},"1":{"1":{"number":"3","date":1596989427,"comment":"У нас гражд.Швеции и России. Русские номера. Измерили темп, мы заполнили бланк, что въехали. Вещей с собой не было почти. Спрашивали нас про декларируемый товар","changes":0,"author":"Татьяна Л","url":"","last_comment":"Я тоже из Швеции номера шведские","last_comment_author":"Лина","last_comment_date":1596990521,"waiting":4},"2":{"number":"10","date":1605882699,"comment":"Сыра привезите Las-valentina@yandex.ru","changes":10,"author":"Valio","url":"","last_comment":"Пропускают на легковых? Есть кто проезжал? Найдите время дать ответ. Очень нужно...","last_comment_author":"оля","last_comment_date":1586265072,"waiting":12},"3":{"number":"0","date":1602965682,"comment":"Никого! Понятно почему! Наши шерстят и взвешивают продукты) Но очень вежливы!)","changes":-6,"author":"Максим","url":"http:\/\/granitsa-online.com\/Pages\/Splash.aspx","last_comment":"Подскажите, пожалуйста, кто-нибудь въезжал в Финляндию из Швеции через северную границу с целью проехать Финляндию транзитом, чтобы в итоге въехать в Россию? Гражданство двойное, номера шведские.","last_comment_author":"Иван Петров","last_comment_date":1603563460,"waiting":0},"4":{"number":"1","date":1601842408,"comment":"Выезд в 11.30 в понедельник 05.10.2020.Возьму 2 попутчиков из Котки еду до Питера- могу до Выборга довезти. Пассажирам налегке. Ватсап 89219692239","changes":-1,"author":"Лина","url":"","last_comment":"Реально","last_comment_author":"Фантомас","last_comment_date":1585069860},"5":{"number":"0","date":1589230261,"comment":"ЛЕГКОВОЙ ЗАКРЫТ!","changes":-240,"author":"Алексей","url":"","last_comment":"Машин не много, 10 минут простояли, поехали. Впереди 4 машины","last_comment_author":"Yuliya","last_comment_date":1578406001},"6":{"number":"0","date":1588339479,"comment":"","changes":-70,"author":"Евгений","url":"","last_comment":"Иван! В вашем случае думаю не будет абсолютно никаких проблем!)","last_comment_author":"Максим","last_comment_date":1604949362}},"":{"1":{"last_comment":"Кто нибудь просит тест на коронавирус? Если ехать из России в Финляндию?","last_comment_author":"Дима","last_comment_date":1603367970},"2":{"last_comment":"ассортимент в Raja-LIDL-DISAS оскудел.Часть витаминов теперь продается только в аптеках. за 2 недели не видел российских легковых авто ВААПЩЕ. Подъехал к шоферам из России на МАПП NUIJAMAA. Сказали что постоянно видят, как разворачивают россиян. Увы.","last_comment_author":"Финский удачник","last_comment_date":1607521425,"number":"1","date":1610527685,"comment":"наши погранцы пропускают тех у кого есть "там" близкие родственники которым нужен уход, к несовершеннолетним детям(в т.ч. на учебе).Постановление 2236,сентября 2020.владельцам недвижки - увы, пока никак.","author":"Оптимист","changes":0}}}

Теперь применим 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(10) { ["number"]=> string(2) "10" ["date"]=> int(1610441400) ["comment"]=> string(144) "Машин не мого но задержка по времени есть у погранцов перед палкой стою 1ч 30 мин" ["changes"]=> int(-10) ["author"]=> string(10) "Ишорь" ["url"]=> string(0) "" ["last_comment"]=> string(199) "Доброй дороги всем.Буду возвращаться в Финляндию на основании трудового договора. Нужен ли перевод? Спасибо." ["last_comment_author"]=> string(8) "Нина" ["last_comment_date"]=> int(1604728739) ["waiting"]=> int(12) } [2]=> array(10) { ["number"]=> string(1) "1" ["date"]=> int(1608655613) ["comment"]=> string(155) "Ну слава богу "в гостях у сказки не закрыли ". зашевелился муравейник . Всем добра." ["changes"]=> int(0) ["author"]=> string(14) "Ватанен" ["url"]=> string(0) "" ["last_comment"]=> string(92) "Финский не у дачник решил имя сменить!) шифруется !)" ["last_comment_author"]=> string(14) "Алексей" ["last_comment_date"]=> int(1608576315) ["waiting"]=> int(2) } [3]=> array(10) { ["number"]=> string(1) "0" ["date"]=> int(1596204849) ["comment"]=> string(126) "Куплю сыр из финки, килограммовый куски - Мильбона или из Призмы, за 700" ["changes"]=> int(-3) ["author"]=> string(10) "Антон" ["url"]=> string(0) "" ["last_comment"]=> string(56) "А кто не пускает? фины или наши?" ["last_comment_author"]=> string(10) "Димас" ["last_comment_date"]=> int(1606389029) ["waiting"]=> int(0) } [4]=> array(9) { ["number"]=> string(2) "10" ["date"]=> int(1606814988) ["comment"]=> string(0) "" ["changes"]=> int(8) ["author"]=> string(5) "Rekka" ["url"]=> string(0) "" ["last_comment"]=> string(127) "Требуют ли погранцы тест на коронавирус с отрицательным результатом?" ["last_comment_author"]=> string(8) "Дима" ["last_comment_date"]=> int(1603370022) } [5]=> array(9) { ["number"]=> string(1) "1" ["date"]=> int(1601929549) ["comment"]=> string(257) "Тоже очень ждём инфо! Впускают только самих владельцев? Квартира оформлена на маму-пенсионерку, одна она не справится. Напишите, кто проехал!" ["changes"]=> int(1) ["author"]=> string(18) "Маргарита" ["url"]=> string(0) "" ["last_comment"]=> string(305) "Мои друзья звонили в русскую вет. службу Иматра. Русские выпускают со справкой и документами на недвижимость. Финам этого тоже достаточно. Хочу реальных подтвеждений." ["last_comment_author"]=> string(10) "Игорь" ["last_comment_date"]=> int(1601908944) } [6]=> array(9) { ["number"]=> string(1) "2" ["date"]=> int(1606678117) ["comment"]=> string(234) "Вяртсиля - Нийрала , обе границы за 10-12 мин, с Питера До Вяртсиля - 3 чача 55 мин по навигатору, дорога шикардось, просто сказка.Павел" ["changes"]=> int(-3) ["author"]=> string(18) "Махараджа" ["url"]=> string(0) "" ["last_comment"]=> string(274) "Не удачник! Буду выезжать 11.11 из Иматры в РФ. Ну очень хочется встретиться с тобой . Посмотреть кто прячется за этим скупым названием) Принимаешь вызов?" ["last_comment_author"]=> string(12) "Максим" ["last_comment_date"]=> int(1604687112) } } [1]=> array(6) { [1]=> array(10) { ["number"]=> string(1) "3" ["date"]=> int(1596989427) ["comment"]=> string(289) "У нас гражд.Швеции и России. Русские номера. Измерили темп, мы заполнили бланк, что въехали. Вещей с собой не было почти. Спрашивали нас про декларируемый товар" ["changes"]=> int(0) ["author"]=> string(17) "Татьяна Л" ["url"]=> string(0) "" ["last_comment"]=> string(59) "Я тоже из Швеции номера шведские" ["last_comment_author"]=> string(8) "Лина" ["last_comment_date"]=> int(1596990521) ["waiting"]=> int(4) } [2]=> array(10) { ["number"]=> string(2) "10" ["date"]=> int(1605882699) ["comment"]=> string(51) "Сыра привезите Las-valentina@yandex.ru" ["changes"]=> int(10) ["author"]=> string(5) "Valio" ["url"]=> string(0) "" ["last_comment"]=> string(149) "Пропускают на легковых? Есть кто проезжал? Найдите время дать ответ. Очень нужно..." ["last_comment_author"]=> string(6) "оля" ["last_comment_date"]=> int(1586265072) ["waiting"]=> int(12) } [3]=> array(10) { ["number"]=> string(1) "0" ["date"]=> int(1602965682) ["comment"]=> string(141) "Никого! Понятно почему! Наши шерстят и взвешивают продукты) Но очень вежливы!)" ["changes"]=> int(-6) ["author"]=> string(12) "Максим" ["url"]=> string(44) "http://granitsa-online.com/Pages/Splash.aspx" ["last_comment"]=> string(358) "Подскажите, пожалуйста, кто-нибудь въезжал в Финляндию из Швеции через северную границу с целью проехать Финляндию транзитом, чтобы в итоге въехать в Россию? Гражданство двойное, номера шведские." ["last_comment_author"]=> string(21) "Иван Петров" ["last_comment_date"]=> int(1603563460) ["waiting"]=> int(0) } [4]=> array(9) { ["number"]=> string(1) "1" ["date"]=> int(1601842408) ["comment"]=> string(241) "Выезд в 11.30 в понедельник 05.10.2020.Возьму 2 попутчиков из Котки еду до Питера- могу до Выборга довезти. Пассажирам налегке. Ватсап 89219692239" ["changes"]=> int(-1) ["author"]=> string(8) "Лина" ["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(1589230261) ["comment"]=> string(30) "ЛЕГКОВОЙ ЗАКРЫТ!" ["changes"]=> int(-240) ["author"]=> string(14) "Алексей" ["url"]=> string(0) "" ["last_comment"]=> string(107) "Машин не много, 10 минут простояли, поехали. Впереди 4 машины" ["last_comment_author"]=> string(6) "Yuliya" ["last_comment_date"]=> int(1578406001) } [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(114) "Иван! В вашем случае думаю не будет абсолютно никаких проблем!)" ["last_comment_author"]=> string(12) "Максим" ["last_comment_date"]=> int(1604949362) } } [""]=> array(2) { [1]=> array(3) { ["last_comment"]=> string(131) "Кто нибудь просит тест на коронавирус? Если ехать из России в Финляндию?" ["last_comment_author"]=> string(8) "Дима" ["last_comment_date"]=> int(1603367970) } [2]=> array(8) { ["last_comment"]=> string(435) "ассортимент в Raja-LIDL-DISAS оскудел.Часть витаминов теперь продается только в аптеках. за 2 недели не видел российских легковых авто ВААПЩЕ. Подъехал к шоферам из России на МАПП NUIJAMAA. Сказали что постоянно видят, как разворачивают россиян. Увы." ["last_comment_author"]=> string(29) "Финский удачник" ["last_comment_date"]=> int(1607521425) ["number"]=> string(1) "1" ["date"]=> int(1610527685) ["comment"]=> string(369) "наши погранцы пропускают тех у кого есть "там" близкие родственники которым нужен уход, к несовершеннолетним детям(в т.ч. на учебе).Постановление 2236,сентября 2020.владельцам недвижки - увы, пока никак." ["author"]=> string(16) "Оптимист" ["changes"]=> int(0) } } }

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

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

10
1610441400
Машин не мого но задержка по времени есть у погранцов перед палкой стою 1ч 30 мин
-10
Ишорь
12

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

Дата дана в формате 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. Статьи можно расшарить в соцсетях, нажав на иконку сети: