Intereting Posts
Вставка массива PHP в две таблицы MySQL php вставляет несколько значений в отдельные строки в таблице mysql PHP: как обновить переменную родительского класса из дочернего класса PHP: Как я могу избежать чтения частичных файлов, которые были перенесены мне с FTP? Замените цвет другим изображением с помощью PHP Как отсортировать многомерный массив с помощью определенного ключа? on localhost redirect работает над ошибкой hostgator Невозможно изменить информацию заголовка (php) file_exists () слишком медленный в PHP. Может ли кто-нибудь предложить более быструю альтернативу? Можно ли включить функцию внутри другой функции? php для удаления файлов старше 24 часов, удаляет все файлы пост-ассоциативный массив с использованием jquery ajax Почему Code Igniter дает мне белую страницу? Не удается отбросить одно значение (id) из db в массиве после нажатия кнопки отправки как я могу получить информацию о БД из wp-config.php с помощью файла () PHP Идеи в очень простом, но безопасном входе

Как декодировать строку JSON с несколькими объектами в PHP?

Я знаю, как декодировать строку JSON с одним объектом с вашей помощью из этого примера. Как декодировать строку JSON

Но теперь я хотел бы улучшить декодирование строки JSON несколькими объектами, и я не могу понять, как это сделать.

Вот пример:

{ "inbox": [ { "firstName": "Brett", "lastName":"McLaughlin" }, { "firstName": "Jason", "lastName":"Hunter" }, { "firstName": "Elliotte", "lastName":"Harold" } ], "sent": [ { "firstName": "Isaac", "lastName": "Asimov" }, { "firstName": "Tad", "lastName": "Williams" }, { "firstName": "Frank", "lastName": "Peretti" } ], "draft": [ { "firstName": "Eric", "lastName": "Clapton" }, { "firstName": "Sergei", "lastName": "Rachmaninoff" } ] } 
  1. Как сделать только один foreach () для декодирования над строкой JSON?
  2. Как определить имена объектов: входящие, отправленные или черновики в этом foreach ()?

Новый ответ

Повторите свой пересмотренный вопрос: foreach фактически работает со свойствами, а также с многозначными элементами (массивами), подробности здесь . Так, например, с строкой JSON в вашем вопросе:

 $data = json_decode($json); foreach ($data as $name => $value) { // This will loop three times: // $name = inbox // $name = sent // $name = draft // ...with $value as the value of that property } 

В пределах вашего основного цикла над свойствами вы можете использовать внутренний цикл, чтобы перебирать записи массива, на которые указывает каждое свойство. Например, если вы знаете, что каждый из свойств верхнего уровня имеет значение массива и что каждая запись массива имеет свойство «firstName», этот код:

 $data = json_decode($json); foreach ($data as $name => $value) { echo $name . ':' foreach ($value as $entry) { echo ' ' . $entry->firstName; } } 

…покажет:

  Входящие:
   Brett
   Джейсон
   Elliotte
 послал:
   Айзек
   Тэд
   Фрэнк
 проект:
   Эрик
   Сергей 

Старый ответ (ы)

Начать редактирование Re:

Теперь я хотел бы знать, как декодировать строку JSON с несколькими объектами!

В примере, который вы опубликовали , есть несколько объектов, они всего лишь содержатся в одном объекте-обертке. Это требование JSON ; вы не можете (например) сделать это:

 {"name": "I'm the first object"}, {"name": "I'm the second object"} 

Этот JSON недействителен. Должен быть один объект верхнего уровня. Он может содержать массив:

 {"objects": [ {"name": "I'm the first object"}, {"name": "I'm the second object"} ]} 

… или, конечно, вы можете указать имена отдельных объектов:

 { "obj0": {"name": "I'm the first object"}, "obj1": {"name": "I'm the second object"} } 

Редактирование конца

Ваш пример – это один объект, содержащий три свойства, значение каждого из которых представляет собой массив объектов. На самом деле, он не сильно отличается от примера в связанном вами вопросе (который также имеет объект со свойствами, имеющими значения массива).

Так:

 $data = json_decode($json); foreach ($data->programmers as $programmer) { // ...use $programmer for something... } foreach ($data->authors as $author) { // ...use $author for something... } foreach ($data->musicians as $musician) { // ...use $musician for something... } 

Вы можете использовать функцию json_decode для декодирования строки JSON:

 $json = <<<JSON { "programmers": [ { "firstName": "Brett", "lastName":"McLaughlin" }, { "firstName": "Jason", "lastName":"Hunter" }, { "firstName": "Elliotte", "lastName":"Harold" } ], "authors": [ { "firstName": "Isaac", "lastName": "Asimov" }, { "firstName": "Tad", "lastName": "Williams" }, { "firstName": "Frank", "lastName": "Peretti" } ], "musicians": [ { "firstName": "Eric", "lastName": "Clapton" }, { "firstName": "Sergei", "lastName": "Rachmaninoff" } ] } JSON; $data = json_decode($json); 

Затем, чтобы посмотреть, как выглядят данные, вы можете сбросить его:

 var_dump($data); 

И вы увидите, что у вас есть объект, содержащий три массива, каждый из которых содержит другие под-объекты:

 object(stdClass)[1] public 'programmers' => array 0 => object(stdClass)[2] public 'firstName' => string 'Brett' (length=5) public 'lastName' => string 'McLaughlin' (length=10) 1 => object(stdClass)[3] public 'firstName' => string 'Jason' (length=5) public 'lastName' => string 'Hunter' (length=6) ... public 'authors' => array 0 => object(stdClass)[5] public 'firstName' => string 'Isaac' (length=5) public 'lastName' => string 'Asimov' (length=6) ... 

Это означает, что вы знаете, как получить доступ к вашим данным.

Например, чтобы отобразить список программистов, вы можете использовать:

 foreach ($data->programmers as $programmer) { echo $programmer->firstName . ' ' . $programmer->lastName . '<br />'; } 

Что принесет вам следующий результат:

 Brett McLaughlin Jason Hunter Elliotte Harold