我不能为我的生活将我的数组转换为嵌套的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]
将是第一行的第二行,但是第2行的第一行,因此是第1行。
基本上我希望结果显示如下(对于上面的例子):
<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
)
)
)
)
)
)
)
)
答案 0 :(得分:1)
您确定您的数组结构与您显示的HTML相匹配吗?我调整了数组,并提出了似乎有用的功能。
function build_list($array, $level=0)
{
foreach($array as $group)
{
echo '<li>';
if(isset($group['letter']))
{
echo $group['letter'];
}
else
{
$class = 'wrap';
if($level%2 == 1)
{
$class = 'inner';
}
echo '<ul class="' . $class . '">';
build_list($group, $level+1);
if($class == 'wrap')
{
echo '<li class="end"><a class="add">Add</a></li>';
}
echo '</ul>';
}
echo '</li>';
}
}
以下是对数组的更改:
$array =
array
(
array("letter" => "A", "data" => "123"), //li
array //li ul
(
array //li ul
(
array("letter" => "B", "data" => "123"), //li
array //li ul
(
array //li ul
(
array("letter" => "C", "data" => "123")
)
)
),
array
(
array("letter" => "D", "data" => "123"),
array
(
array
(
array("letter" => "E", "data" => "123")
)
)
)
)
);
然后调用它:
<ul class="inital">
<?php
build_list($array);
?>
</ul>