階層の深さが不明な多次元連想配列(JSONオブジェクト)のネストされた全てのノードにアクセスします。
ツリー情報を要素ごとに再帰的に取得し、全ての要素の親子関係を網羅するサンプルコードを掲載します。
コード
サンプルとして下記のJSONを用います。
{
"Description": "SampleJson",
"Copyright": "Copyright (C) 2018 mio.yokohama All Rights Reserved.",
"Status": "200",
"CompressType": "",
"Feature": [
{
"Id": "0106001",
"Name": "うーメン",
"Property": {
"first": {
"second": {
"third": {
"target": "3rd",
"fifth": {
"sixth": {
"Target": "6th"
},
"Target": "5th"
}
}
},
"Target": "1st"
}
}
}
],
"Dictionary": {
"Genre": [
{
"Id": "01",
"Name": "土えもの付属うーメン",
"bool": "True",
"Level": 1
},
{
"Id": "0106",
"Name": "ビーノレ",
"bool": false,
"Level": 2
}
]
}
}
サンプル(親子関係網羅)
末端要素とその全ての親を再帰的に処理するコードを書きました。
サンプルでは標準出力しています。
出力結果
Description|SampleJson Copyright|Copyright (C) 2018 mio.yokohama All Rights Reserved. Status|200 CompressType| Feature|0|Id|0106001 Feature|0|Name|うーメン Feature|0|Property|first|second|third|target|3rd Feature|0|Property|first|second|third|fifth|sixth|Target|6th Feature|0|Property|first|second|third|fifth|Target|5th Feature|0|Property|first|Target|1st Dictionary|Genre|0|Id|01 Dictionary|Genre|0|Name|土えもの付属うーメン Dictionary|Genre|0|bool|True Dictionary|Genre|0|Level|1 Dictionary|Genre|1|Id|0106 Dictionary|Genre|1|Name|ビーノレ Dictionary|Genre|1|bool|false Dictionary|Genre|1|Level|2
コード
<?php
$json_string = '〜省略(JsonStrings)〜';
$json_array = json_decode($json_string, true);
getArrayElementsRecursively($json_array);
function getArrayElementsRecursively($array, $depth = 0, $index = array(), $strings = "") {
foreach ((array)$array as $key => $value) {
for ($i = 0;$i < $depth;$i++) $strings.= $index[$i] . "|";
if (!is_array($key)) {
$index[$depth] = $key;
$strings.= $key . "|";
}
if (is_array($value)) {
$strings = "";
$depth++;
getArrayElementsRecursively($value, $depth, $index, $strings);
$depth--;
} else {
if (is_bool($value)) $value = ((true === $value) ? 'true' : 'false');
$strings.= strval($value) . PHP_EOL;
}
echo $strings;
$strings = "";
}
}
?>

