【发布时间】:2023-04-06 16:55:01
【问题描述】:
我使用了以下 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
)
)
)
)
)
)
现在我想使用该排序数组并生成一个 single HTML SELECT,它显示并表示父->子结构,如下例所示:
<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 'User Manual -> Users -> Privileges',VALUE 是 Privileges 的 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。欢迎在这里提供任何帮助。谢谢!
【问题讨论】:
-
你的阵列是什么样的?可能涉及到递归的味道。
-
你说得对,我使用递归来显示 2 个级别,所以我遇到的问题是保留超过两个级别的树结构历史。问题是递归通过预先排序的数组进行。它与每个孩子打交道,随着它的进步,它是孩子,自然而然。因此,当它退回到以前的孩子时,我很难概念化退回字符串。希望这是有道理的。我将使用数组示例更新我的帖子。
-
@Brad:您的 sn-p 中没有递归调用。
toUL是什么?$target是什么?你会考虑使用视觉提示(缩进)而不是重复完整的路径来表达层次结构吗? -
@nikc:很抱歉。我编辑了帖子以修复该 toUL。我为这篇文章将函数重命名为 buildOptions 并忘记更新递归回调。我会对视觉提示感兴趣,并假设视觉提示(缩进)将基于树的深度。我考虑了这一点,但我的思想无法围绕这个想法展开,因为它似乎与我最初想要完成的目标非常相似。
-
@Brad:几乎完全一样,但传输的字节更少,最终用户读取的内容也更少;-) [你只需要传递一个
int递归堆栈,将$parent = null替换为$level = 0并调用buildOptions(<...>, $level + 1),然后使用$level作为边距/填充乘数。]