我的主要问题是我想使用 PHP 在 HTML 中生成一个无序列表。我从 SQL 查询中获取数据,然后需要使用我自己尝试编写的 PHP 函数将其连接到无序列表中。每个项目都应该是一个li
,如果它有一个子项目,它应该打开一个新的ul
,子项目为li
,它又可以包含子项目等
我有一个数组,我在其中输出树本身的每个部分。它看起来像这样:
[0] => Array (
[0] => Application Integration
[1] =>
)
[1] => Array (
[0] => Application Integration
[1] => Windows
[2] =>
)
[2] => Array (
[0] => Application Integration
[1] => Windows
[2] => Leitungen
)
[3] => Array (
[0] => Application Integration
[1] => Windows
[2] => Leitungen
[3] => WAN
)
[4] => Array (
[0] => Application Integration
[1] => Windows
[2] => Leitungen
[3] => Mail
)
[5] => Array (
[0] => Application Integration
[1] => Windows
[2] => EDI
)
[6] => Array (
[0] => Application Integration
[1] => Windows
[2] => EDI
[3] => Word
)
[7] => Array (
[0] => Application Integration
[1] => Windows
[2] => EDI
[3] => LAN
)
[8] => Array (
[0] => Application Integration
[1] => Internet
[2] =>
)
[9] => Array (
[0] => Application Integration
[1] => Internet
[2] => Office
)
[10] => Array (
[0] => Application Integration
[1] => Internet
[2] => Office
[3] => Powerpoint
)
[11] => Array (
[0] => Application Integration
[1] => Internet
[2] => Office
[3] => Excel
)
[12] => Array (
[0] => Application Integration
[1] => Internet
[2] => Leitungen
)
[13] => Array (
[0] => Application Integration
[1] => Internet
[2] => Leitungen
[3] => SQL Developer
)
[14] => Array (
[0] => Application Integration
[1] => Internet
[2] => Leitungen
[3] => Pokerstars
)
我希望输出被一个无序列表包围,其中数组中的每个项目都是一个列表元素,如果它有一个子项目,它也应该在一个无序列表中,......它应该像下面的列表:
<ul>
<li>
Applicaton Integration
<ul>
<li>
Windows
<ul>
<li>
EDI
<ul>
<li>Word</li>
<li>LAN</li>
</ul>
</li>
</ul>
</li>
<li>
Internet
<ul>
<li></li>
</ul>
</li>
</ul>
</li>
</ul>
...etc
我尝试用 PHP 编写以下函数,但它并不是我想要的,因为它提前和/或太晚关闭了标签。
function treeOut(array $tree): string{
$markup = '';
print_r($tree);
foreach($tree as $branch) {
if(!empty($branch[1])){
$markup.='<ul class="Stufe1">';
$markup.='<li>';
if(!empty($branch[2])){
$markup.='<ul class="Stufe2">';
$markup.='<li>';
if(!empty($branch[3])){
$markup.='<ul class="Stufe3">';
$markup.='<li>';
$markup.='<input type="checkbox" name=""/>'.$branch[3];
$markup.='</li></ul>';
}else{
$markup.='<input type="checkbox" name=""/>'.$branch[2];
}
$markup.='</ul></li>';
}else{
$markup.='<input type="checkbox" name=""/>'.$branch[1];
}
$markup.='</li></ul>';
}else{
$markup.='<li><input type="checkbox" name=""/>'.$branch[0];
}
}
return $markup;
}
我很抱歉有那么多代码,但我会很感激任何帮助。
最佳答案
要解决涉及嵌套级别的数据结构的问题,但应该以大致相同的方式处理,递归是你最好的 friend 。
如果您不熟悉这种技术,我们的想法是设计一个会调用自身的函数。
关于你的问题,我们可以这样考虑:
首先,一个函数来修改你的数组,以便它可以被处理。
function nester(array $array, $idx = 0) {
if (array_key_exists($idx, $array) && !empty($array[$idx])) {
return array($array[$idx] => nester($array, $idx + 1));
}
return array();
}
function treeParser(array $array_tree) {
$dom_tree = '';
foreach ($array_tree as $key => $val) {
if (is_array($val) && count($val)) {
$dom_tree .= "<li>$key".treeParser($val).'</li>';
} else {
$dom_tree .= "<li>$key</li>";
}
}
return ($dom_tree ? "<ul>$dom_tree</ul>" : '');
}
$array_nested = array();
foreach ($array as $value) {
$array_nested[] = nester($value);
}
$DOM_tree = treeParser(array_merge_recursive(... $array_nested));
在此之前,一个函数会浏览您的每个子数组并将它们转换为嵌套数组,以便我们可以对它们进行递归。在 array_merge_recursive
的帮助下,这些数组被合并到您要构建的 DOM 的干净树中。
然后另一个函数将您的数组作为参数并使用 foreach 浏览它。
每次找到一个数组时,它都会附加一对 <li>
包含当前数组键的标签,如果它不为空,则最终返回调用该数组的自身。
当函数的一个实例处理完它的整个子数组时,它返回它的工作——字符串 $dom_tree
- 在 <ul>
之间标签。
如果那个实例是主要实例——你自称的那个——这些<ul>
标签将是包含整个数据结构的主要无序列表。
从理论上讲,无论阵列的深度如何,它都可以工作,但如果它非常深,请注意堆栈溢出。
关于php - 如何使用 php 将树状数组输出到列表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45480020/