使用 PHP 将平面 JSON 转换为嵌套 JSON
Convert flat JSON to nested JSON with PHP
我有一个 JSON 文件,其中只有一个数组,所有元素都在同一层级。
每个条目都有一个介于 1 和 4 之间的“级别”属性。
我想在最后有一个嵌套数组,它在 3 级中包含所有 4 级,在 2 级中包含所有 3 级,在 1 级中包含所有 2 级。
JSON例子是这样的:
[{"text e":"Test","id":1073,"level":1,"chapter":"1"}, {"text e":"Test
2","id":1073,"level":2,"chapter":"1.1"}, {"text e":"Test
3","id":1063,"level":2,"chapter":"1.2"}, {"text e":"Test
4","id":1031,"level":3,"chapter":"1.2.1"}, {"text e":"Test
5","id":1334,"level":4,"chapter":"1.2.1.1"}, {"text e":"Test
6","id":1127,"level":2,"chapter":"1.3"}, {"text e":"Test
7","id":1092,"level":2,"chapter":"1.4"}, {"text e":"Test
8","id":1012,"level":1,"chapter":"2"}]
<?php
$json = json_decode(file_get_contents("menuitems.json"), true);
$newArr = array();
$keyLevel1 = 0;
$keyLevel2 = 0;
$keyLevel3 = 0;
$keyLevel4 = 0;
foreach ($json as $key => $item) {
if ($item['level'] == 1) {
$newArr[$keyLevel1] = $item;
$keyLevel1 = $keyLevel1 + 1;
$keyLevel2 = 0;
$keyLevel3 = 0;
$keyLevel4 = 0;
} else if ($item['level'] == 2) {
$newArr[$keyLevel1][$keyLevel2] = $item;
$keyLevel2 = $keyLevel2 + 1;
$keyLevel3 = 0;
$keyLevel4 = 0;
} else if ($item['level'] == 3) {
$newArr[$keyLevel1][$keyLevel2][$keyLevel3] = $item;
$keyLevel3 = $keyLevel3 + 1;
$keyLevel4 = 0;
} else if ($item['level'] == 4) {
$newArr[$keyLevel1][$keyLevel2][$keyLevel3][$keyLevel4] = $item;
$keyLevel4 = $keyLevel4 + 1;
}
}
echo json_encode($newArr);
?>
这段代码似乎适用于第一层,但最后一项的第二层是写在最后一个对象中的,它们没有嵌套。
我做错了什么?
这是典型的差一错误。您在错误的时间递增了所有 keyLevel 变量。最简单的修复可能是始终(重新)将它们全部初始化为 -1,然后在 之前递增 ,例如,第一个“if”将变为:
$keyLevel1 = -1;
...
if ($item['level'] == 1) {
$keyLevel1 = $keyLevel1 + 1;
$newArr[$keyLevel1] = $item;
$keyLevel2 = -1;
$keyLevel3 = -1;
$keyLevel4 = -1;
}
这样,当您处理后续的第 2、3 和 4 级项目时,$keyLevel1 将具有正确的值。
我有一个 JSON 文件,其中只有一个数组,所有元素都在同一层级。 每个条目都有一个介于 1 和 4 之间的“级别”属性。 我想在最后有一个嵌套数组,它在 3 级中包含所有 4 级,在 2 级中包含所有 3 级,在 1 级中包含所有 2 级。
JSON例子是这样的:
[{"text e":"Test","id":1073,"level":1,"chapter":"1"}, {"text e":"Test 2","id":1073,"level":2,"chapter":"1.1"}, {"text e":"Test 3","id":1063,"level":2,"chapter":"1.2"}, {"text e":"Test 4","id":1031,"level":3,"chapter":"1.2.1"}, {"text e":"Test 5","id":1334,"level":4,"chapter":"1.2.1.1"}, {"text e":"Test 6","id":1127,"level":2,"chapter":"1.3"}, {"text e":"Test 7","id":1092,"level":2,"chapter":"1.4"}, {"text e":"Test 8","id":1012,"level":1,"chapter":"2"}]
<?php
$json = json_decode(file_get_contents("menuitems.json"), true);
$newArr = array();
$keyLevel1 = 0;
$keyLevel2 = 0;
$keyLevel3 = 0;
$keyLevel4 = 0;
foreach ($json as $key => $item) {
if ($item['level'] == 1) {
$newArr[$keyLevel1] = $item;
$keyLevel1 = $keyLevel1 + 1;
$keyLevel2 = 0;
$keyLevel3 = 0;
$keyLevel4 = 0;
} else if ($item['level'] == 2) {
$newArr[$keyLevel1][$keyLevel2] = $item;
$keyLevel2 = $keyLevel2 + 1;
$keyLevel3 = 0;
$keyLevel4 = 0;
} else if ($item['level'] == 3) {
$newArr[$keyLevel1][$keyLevel2][$keyLevel3] = $item;
$keyLevel3 = $keyLevel3 + 1;
$keyLevel4 = 0;
} else if ($item['level'] == 4) {
$newArr[$keyLevel1][$keyLevel2][$keyLevel3][$keyLevel4] = $item;
$keyLevel4 = $keyLevel4 + 1;
}
}
echo json_encode($newArr);
?>
这段代码似乎适用于第一层,但最后一项的第二层是写在最后一个对象中的,它们没有嵌套。 我做错了什么?
这是典型的差一错误。您在错误的时间递增了所有 keyLevel 变量。最简单的修复可能是始终(重新)将它们全部初始化为 -1,然后在 之前递增 ,例如,第一个“if”将变为:
$keyLevel1 = -1;
...
if ($item['level'] == 1) {
$keyLevel1 = $keyLevel1 + 1;
$newArr[$keyLevel1] = $item;
$keyLevel2 = -1;
$keyLevel3 = -1;
$keyLevel4 = -1;
}
这样,当您处理后续的第 2、3 和 4 级项目时,$keyLevel1 将具有正确的值。