我在创建排序的多级父级>子数组时使用了以下stackoverflow thread,这非常有用。
以下是基于上述线程的排序方法的示例多级(3级)父级>子排序数组:
Array
(
[1] => Array
(
[name] => User Manual
[parentId] => 0
[children] => Array
(
[2] => Array
(
[name] => Users
[parentId] => 1
[children] => Array
(
[4] => Array
(
[name] => Privileges
[parentId] => 2
)
)
)
[3] => Array
(
[name] => Reference
[parentId] => 1
[children] => Array
(
[5] => Array
(
[name] => Glossary
[parentId] => 3
)
[6] => Array
(
[name] => Index
[parentId] => 3
)
)
)
)
)
)
现在我想采用那个排序数组并生成一个单个 HTML SELECT,它显示并代表parent->子结构,如下例所示:
<option value='1'>User Manual</option>
<option value='2'>User Manual -> Users</option>
<option value='4'>User Manual -> Users -> Privileges</option>
<option value='3'>User Manual -> Reference</option>
<option value='5'>User Manual -> Reference -> Glossary</option>
<option value='6'>User Manual -> Reference -> Index</option>
上面的目标是编译一个显示字符串,表示每个项目的多级父/子路径。每个选项的VALUE是表示的已编译字符串中的最后一项。因此,对于OPTION'用户手册 - &gt;用户 - &gt;权限'VALUE是权限的ID,但显示文本表示数组中的父/子关系。
我创建的选择总是最终显示如下所示的选项列表:
<option value='1'>User Manual</option>
<option value='2'>User Manual -> Users</option>
<option value='4'>Users -> Privileges</option>
<option value='3'>User Manual -> Reference</option>
<option value='5'>Reference -> Glossary</option>
<option value='6'>Reference -> Index</option>
您可以看到它只能跟踪父/子关系的一个级别。
我处理数组以创建选择选项列表的函数如下:
function buildOptions($arr, $target, $parent = NULL) {
$html = "";
foreach ( $arr as $key => $v )
{
if (array_key_exists('children', $v))
{
if ( $key == $target )
$html .= "<option value='$key' selected>$parent {$v['name']}</option>\n";
else
$html .= "<option value='$key'>$parent {$v['name']}</option>\n";
$html .= buildOptions($v['children'],$target,$v['name']." > ");
}
else if ( $key == $target )
$html .= "<option value='$key' selected>$parent {$v['name']}</option>\n";
else
$html .= "<option value='$key'>$parent {$v['name']}</option>\n";
}
return $html;
}
当有多个级别时,我无法跟踪前一个X parent.name。这里的任何帮助都会受到欢迎。谢谢!
答案 0 :(得分:3)
以这种方式修复递归调用,您应该在每个节点上获得完整的层次结构:
function buildOptions($arr, $target, $parent = NULL) {
$html = "";
foreach ( $arr as $key => $v )
{
if ( $key == $target )
$html .= "<option value='$key' selected>$parent {$v['name']}</option>\n";
else
$html .= "<option value='$key'>$parent {$v['name']}</option>\n";
if (array_key_exists('children', $v))
$html .= buildOptions($v['children'],$target,$parent . $v['name']." > ");
}
return $html;
}