Я не могу на всю жизнь преобразовать свой массив во вложенное дерево 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 и т. д.
Где в основном я хочу, чтобы результат выглядел следующим образом (для примера выше):
<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
)
)
)
)
)
)
)
)