将我的JSON字符串格式化为<;ol>;PHP中的有序列表
我正在为一个宠物项目做一个简单的CMS。我目前有一个JSON字符串,其中包含菜单结构的页面ID和父页面ID的列表 现在我想将这个字符串转换成嵌套的或层次结构的列表(有序列表) 我试着寻找循环,但似乎最终得到了一系列过于复杂的子类。我正在努力用PHP找到一个合适的轻量级解决方案 以下是JSON:将我的JSON字符串格式化为<;ol>;PHP中的有序列表,php,html,json,Php,Html,Json,我正在为一个宠物项目做一个简单的CMS。我目前有一个JSON字符串,其中包含菜单结构的页面ID和父页面ID的列表 现在我想将这个字符串转换成嵌套的或层次结构的列表(有序列表) 我试着寻找循环,但似乎最终得到了一系列过于复杂的子类。我正在努力用PHP找到一个合适的轻量级解决方案 以下是JSON: **[{"id":3,"children":[{"id":4,"children":[{"id":5}]}]},{"id":6},{"id":2},{"id":4}]** 以下是所需的输出: <o
**[{"id":3,"children":[{"id":4,"children":[{"id":5}]}]},{"id":6},{"id":2},{"id":4}]**
以下是所需的输出:
<ol>
<li>3
<ol>
<li>4</li>
<ol>
<li>5</li>
</ol>
</ol>
</li>
<li>6</li>
<li>2</li>
<li>4</li>
</ol>
三,
四,
五,
六,
二,
四,
PHP中有没有内置的东西可以简化这个过程?以前有人有过这种经历吗
我是PHP和SE的新手。期待您的来信
这是我目前的进展(效果不太好)
您可以使用递归深入数据内部。如果当前值是数组,则再次递归。考虑这个例子:
call_user_func(function ($array, $id = 'id', $list = 'children') {
$ul = function ($array) use (&$ul, $id, $list) {
echo '<ul>', !array_map(function ($child) use ($ul, $id, $list) {
echo '<li>', $child[$id], isset($child[$list]) && $ul($child[$list])
, '</li>';
}, $array), '</ul>';
};
$ul($array);
}, json_decode('[{"id":3,"children":[{"id":4,"children":[{"id":5}]}]},{"id":6},
{"id":2},{"id":4}]', TRUE));
$json_string='[{“id”:3,“children”:[{“id”:4,“children”:[{“id”:5}]}}}、{“id”:6}、{“id”:2}、{“id”:4}];
$array=json\u decode($json\u字符串,true);
函数生成列表($array){
$list='';
foreach($key=>$value的数组){
foreach($key=>$index的值){
if(is_数组($index)){
$list.=构建列表($index);
}否则{
$list.=“$index ”;
}
}
}
$list.='';
返回$list;
}
echo build_列表($array);
您正在寻找的是所谓的递归,它可以通过函数调用自身来完成
如果在一个函数中列出列表的所有节点,则可以对所有子列表应用相同的函数。然后,这些子列表也会对其子对象执行相同的操作
<ul>
<li>3
<ul>
<li>4
<ul>
<li>5</li>
</ul>
</li>
</ul>
</li>
<li>6</li>
<li>2</li>
<li>4</li>
</ul>
使用可以递归遍历JSON的函数,您可以获得所需的功能。考虑下面的代码:(这只不过是列出了<代码> ID <代码>的属性,正如您希望的代码显示的)
$json='[{“id”:3,“children”:[{“id”:4,“children”:[{“id”:5}]}},{“id”:6},{“id”:2},{“id”:4}]';
函数createOLList($group){
$output=(is_数组($group))?“”:“”;
foreach($attr=>$item的组){
if(is_数组($item)| is_对象($item)){
$output.=createOLList($item);
}否则{
如果($attr==“id”){
$output.=“$item ”;
}
}
}
$output.=(是数组($group))?“”:“”;
返回$output;
}
打印(createOLList(json_decode($json));
这将产生以下HTML输出
function build_list($array) {
$list = '<ul>';
foreach($array as $key => $value) {
if (is_array($value)) {
$list .= "<strong>$key</strong>: " . build_list($value);
} else {
$list .= "<li><strong>$key</strong>: $value</li>";
}
}
$list .= '</ul>';
return $list;
}
build_list(json_encode($json_string),true);
三,
四,
五,
六,
二,
四,
我发现我必须修复或简化上面的几乎所有功能。
所以这里我带来了一些简单的,有效的,仍然是递归的东西
函数构建列表($array){
$list=“”;
foreach($key=>$value的数组){
if(是_数组($value)){
$list.=“$key:”。构建列表($value);
}否则{
$list.=“- $key:$value
”;
}
}
$list.='
';
返回$list;
}
build_list(json_encode($json_string),true);
您可以通过几个内置的PHP工具来实现这一点。对于初学者,使用将JSON字符串转换为PHP数组。然后,你可以用一个嵌套的foreach
@DanielA.White循环它,或者在你的例子中,用一个嵌套的foreach
@DanielA.White当然-我整个上午都在做这个。我将添加一些到目前为止我已经尝试过的内容。@cracketastic谢谢你的指点-我用我当前进度的一个片段更新了我的问题。我正在修改它,所以嵌套的标记代码丢失了。@ABOO欢迎您提供指针。我发布了一个答案,但我看到你已经选择了一个。无论如何,很高兴你能得到你所需要的帮助。这很好,但是,它似乎只允许一个孩子级别。我需要它去至少4。除了破解代码和添加更多循环之外,我不确定如何使用它。好的,我将编辑以允许两个子级别,但我认为其余的可以自己处理:)。它可以通过多种方式完成,你甚至可以创建一个递归函数,当一个节点有一个孩子的时候,它会用一个corespondincall_user_func(function ($array, $id = 'id', $list = 'children') {
$ul = function ($array) use (&$ul, $id, $list) {
echo '<ul>', !array_map(function ($child) use ($ul, $id, $list) {
echo '<li>', $child[$id], isset($child[$list]) && $ul($child[$list])
, '</li>';
}, $array), '</ul>';
};
$ul($array);
}, json_decode('[{"id":3,"children":[{"id":4,"children":[{"id":5}]}]},{"id":6},
{"id":2},{"id":4}]', TRUE));
<ul>
<li>3
<ul>
<li>4
<ul>
<li>5</li>
</ul>
</li>
</ul>
</li>
<li>6</li>
<li>2</li>
<li>4</li>
</ul>
$json = '[{"id":3,"children":[{"id":4,"children":[{"id":5}]}]},{"id":6},{"id":2},{"id":4}]';
function createOLList($group) {
$output = (is_array($group)) ? "<ol>" : "";
foreach($group as $attr => $item) {
if(is_array($item) || is_object($item)) {
$output .= createOLList($item);
} else {
if($attr == "id") {
$output .= "<li>$item</li>";
}
}
}
$output .= (is_array($group)) ? "</ol>" : "";
return $output;
}
print(createOLList(json_decode($json)));
<ol>
<li>3</li>
<ol>
<li>4</li>
<ol>
<li>5</li>
</ol>
</ol>
<li>6</li>
<li>2</li>
<li>4</li>
</ol>
function build_list($array) {
$list = '<ul>';
foreach($array as $key => $value) {
if (is_array($value)) {
$list .= "<strong>$key</strong>: " . build_list($value);
} else {
$list .= "<li><strong>$key</strong>: $value</li>";
}
}
$list .= '</ul>';
return $list;
}
build_list(json_encode($json_string),true);