Извлечение вложенных данных

Объекты и массивы JSON также могут быть вложенными.

Объект JSON может произвольно содержать другие объекты JSON, массивы, вложенные массивы, массивы объектов JSON и т.д.

В следующем примере показано, как декодировать вложенный объект JSON и вывести все его значения в PHP. Весь блок кода содержит комментарии.

<?php
// Определение рекурсивной функции для извлечения вложенных значений
function printValues($arr) {
    global $count;
    global $values;
    
    // проверяем массив ли на входе
    if(!is_array($arr)){
        die("ERROR: Input is not an array");
    }
    
    /*
    Проходим по массиву, если значение само является массивом, рекурсивно вызываем функцию, иначе добавляем найденное значение в массив выходных элементов и увеличиваем счетчик на 1 для каждого найденного значения
    */
    foreach($arr as $key=>$value){
        if(is_array($value)){
            printValues($value);
        } else{
            $values[] = $value;
            $count++;
        }
    }
    
    // возвращаем суммарное количество и значения, найденные в массиве
    return array('total' => $count, 'values' => $values);
}
 
// присваиваем переменной PHP строку в кодировке JSON
$json = '{
    "book": {
        "name": "Harry Potter and the Goblet of Fire",
        "author": "J. K. Rowling",
        "year": 2000,
        "characters": ["Harry Potter", "Hermione Granger", "Ron Weasley"],
        "genre": "Fantasy Fiction",
        "price": {
            "paperback": "$10.40", "hardcover": "$20.32", "kindle": "4.11"
        }
    }
}';
// декодирование данных JSON в формате ассоциативного массива PHP
$arr = json_decode($json, true);
 
// Вызываем функцию и выводим все значения
$result = printValues($arr);
echo "<h3>" . $result["total"] . " value(s) found: </h3>";
echo implode("<br>", $result["values"]);
 
echo "<hr>";
 
// Выводим одиночные значения
echo $arr["book"]["author"] . "<br>";  // Output: J. K. Rowling
echo $arr["book"]["characters"][0] . "<br>";  // Output: Harry Potter
echo $arr["book"]["price"]["hardcover"];  // Output: $20.32
?>

Была ли эта страница полезной?