【发布时间】:2014-12-14 22:00:50
【问题描述】:
我正在尝试将任何 JSON 对象打印为简单的 HTML 表单输入,并将名称属性作为点表示法的 json 属性的 Xpath。
到目前为止它有效,但我失去了最初的轨迹
function printInp($title, $pre, $val, $rulekey = false) {
$html = "<label for='$pre'>$pre</label>";
$html .= "<input name='$pre' value='$val' type='text' />";
return $html;
}
function printForm($title, $item, $pre = '', $rulekey=false) {
if (!is_array($item)) {
echo printInp($title, $pre, $item, $rulekey);
} else {
foreach ($item as $key => $val) {
$pre = (empty($pre)) ? $key : $pre . '.' . $key;
if (is_array($val)) {
printForm($title, $val, $pre, $key);
} else {
echo printInp($title, $pre, $val, $key);
}
$pre = '';
}
}
}
$jsonStr = json_decode('[{"id":12,"name":"live music","icon":{"url":null,"thumb":{"url":null},"ios_profile":{"url":null},"medium":{"url":null}},"display_name":null,"top_level":false}]', TRUE);
echo printForm('test', $jsonStr);
打印...
<label for='id'>id</label><input name='id' value='12' type='text' class='' />
<label for='name'>name</label><input name='name' value='live music' type='text' class='' />
<label for='icon.url'>icon.url</label><input name='icon.url' value='' type='text' class='' />
<label for='thumb.url'>thumb.url</label><input name='thumb.url' value='' type='text' class='' />
<label for='ios_profile.url'>ios_profile.url</label><input name='ios_profile.url' value='' type='text' class='' />
<label for='medium.url'>medium.url</label><input name='medium.url' value='' type='text' class='' />
<label for='display_name'>display_name</label><input name='display_name' value='' type='text' class='' />
<label for='top_level'>top_level</label><input name='top_level' value='' type='text' class='' />
问题:当我遍历数组时,我失去了顶级节点名称的跟踪 - 在这种情况下为“图标”。
应该是这样的:
<label for='id'>id</label><input name='id' value='12' type='text' class='' />
<label for='name'>name</label><input name='name' value='live music' type='text' class='' />
<label for='icon.url'>icon.url</label><input name='icon.url' value='' type='text' class='' />
<label for='icon.thumb.url'>icon.thumb.url</label><input name='icon.thumb.url' value='' type='text' class='' />
<label for='icon.ios_profile.url'>icon.ios_profile.url</label><input name='icon.ios_profile.url' value='' type='text' class='' />
<label for='icon.medium.url'>icon.medium.url</label><input name='icon.medium.url' value='' type='text' class='' />
<label for='display_name'>display_name</label><input name='display_name' value='' type='text' class='' />
<label for='top_level'>top_level</label><input name='top_level' value='' type='text' class='' />
(我会接受任何语言的答案)
【问题讨论】:
-
如果您的 json 对象级别将是无限的,您可能需要递归地遍历它们,如果级别将被修复,那么只需检查当前级别是否仍然是一个数组
-
@Ghost,级别可以达到 4 级深度(但我宁愿不围绕该限制进行设计)。我目前正在递归地做。
标签: javascript php json xpath recursion