【发布时间】:2023-04-02 13:49:01
【问题描述】:
我无法将我的数组转换为嵌套的 UL LI 树,我整天都在尝试,但肯定有一些我无法发现的缺陷(可能是因为我的数组不是非常一个简单的)。
数组基本上采用以下形式:
$array = array(
"0" => array(
"0" => array("letter" => "A", "data" => "123"),
"1" => array(
"0" => array(
"0" => array("letter" => "B", "data" => "123"),
"1" => array(
"0" => array(
"0" => array("letter" => "C", "data" => "123")
)
)
),
"1" => array(
"0" => array("letter" => "D", "data" => "123"),
"1" => array(
"0" => array(
"0" => array("letter" => "E", "data" => "123")
)
)
)
)
)
);
解释上面的数组
数组成对出现——第一个数字是组,第二个是行。上面有 3 列(或我称之为级别),并且只有一个“组”。
所以[0][0] 将是第 0 组的第一行,[0][1][0][0] 将是第 1 级的第二行,但是是第 2 级的第一行,依此类推。
基本上我希望结果如下所示(对于上面的示例):
<ul id="mylist">
<li>
<ul class="initial">
<li>A</li>
<li class="top">
<ul class="wrap">
<li>
<ul class="inner">
<li>B</li>
<li class="top">
<ul class="wrap">
<li>
<ul class="inner">
<li>C</li>
</ul>
</li>
<li class="end"><a class="add">Add</a></li>
</ul>
</li>
</ul>
</li>
<li>
<ul class="inner">
<li>D</li>
<li class="top">
<ul class="wrap">
<li>
<ul class="inner">
<li>E</li>
</ul>
</li>
<li class="end"><a class="add">Add</a></li>
</ul>
</li>
</ul>
</li>
<li class="end"><a class="add">Add</a></li>
</ul>
</li>
</ul>
</li>
<li class="end"><a class="add">Add</a></li>
</ul>
基本上,“add”出现在每个节点分支的末尾(“wrap”类中的最后一个列表项)。
到目前为止,我已经完成了以下操作,但我觉得它根本不正确,并且如果添加了额外的节点或删除了节点,则无法正常工作。
function recursion($data, $level){
$skip = array_key_exists('data', $data[0]) ? 0 : 1;
if($skip == 0){
$level++;
if($level !== 1){
$out .= "<li>\n";
}
if($level == 1){
$out .= "<ul class='initial'>\n";
} else {
$out .= "<ul class='inner'>\n";
}
}
$count = 0;
$loop_count = 0;
$show_end = 0;
foreach($data as $key => $value){
$loop_count++;
if(is_array($value) && array_key_exists('data', $value)){
$count++;
$out .= ($skip == 0) ? "<li>" : "";
if($value['data'] == "123"){
$out .= $value['letter'];
}
if(!is_array($data[($key+1)][0])){
$out .= "</li>\n";
$out .= "<li class=\"end\"><a class=\"add\">Add</a></li>\n";
$out .= "</ul>\n";
$out .= "</li>\n";
$out .= "</ul>\n";
$out .= "</li>\n";
$out .= "<li class=\"end\"><a class=\"add\">Add</a></li>\n";
$show_end = 1;
}
$last_key = $key;
} else if(is_array($value)){
$out.= recursion($value, $level);
}
if($show_end == 1){
$out .= "</ul>\n";
}
if(is_array($value) && array_key_exists('data', $value) && !is_array($data[($key+1)])){
$out .= "</li>\n";
}
if($show_end == 1 && count($data) !== $count){
$out .= "<li>\n";
}
}
return $out;
}
print_r($array, true) 的输出
Array
(
[0] => Array
(
[0] => Array
(
[letter] => A
[data] => 123
)
[1] => Array
(
[0] => Array
(
[0] => Array
(
[0] => Array
(
[letter] => B
[data] => 123
)
[1] => Array
(
[0] => Array
(
[0] => Array
(
[letter] => C
[data] => 123
)
)
)
)
[1] => Array
(
[0] => Array
(
[letter] => D
[data] => 123
)
[1] => Array
(
[0] => Array
(
[0] => Array
(
[letter] => E
[data] => 123
)
)
)
)
)
)
)
)
【问题讨论】:
-
可以用javascript吗? (使用 jQuery?)
-
花更多时间在您的问题中解释您的数据结构,IMO。
-
@Michael Javascript?潜在 - 属于,因为它可以正确显示树
-
@drrcknlsn 我会在上面尝试
-
你能显示
echo "<pre>" . print_r($array,true) . "</pre>";的输出吗?
标签: php arrays recursion tree html-lists