Итак, моя функция hierTree () по умолчанию печатает вложенные списки ul или ol , для неопределенной глубины вложенных массивов эта функция будетпоработайте из коробки для примера массива, приведенного в вашем вопросе.
function hierTree($arr, $tag = 'ul', $key = 'comment', $lvl = 0)
{
$tabs = (!$lvl)? '': str_repeat("\t", $lvl);
reset($arr);
echo "$tabs<$tag>\n";
while (list(, $v) = each($arr))
{
echo "$tabs\t<li>";
echo "{$v[$key]}";
if (count($v['children']))
{
echo "\n";
hierTree($v['children'], $tag, $key, $lvl +1);
echo "$tabs\t";
}
echo "</li>\n";
}
echo "$tabs</$tag>\n";
}
hierTree($tree);
Вывод этой функции будет с хорошим отступом , чтобы она была легко читаемой.
Кроме того, если вы сделаете hierTree($tree, 'ol'); you will get an ordered list. Id you do hierTree($tree, 'ol', 'id');
Вы получите упорядоченное дерево, и вместо поля по умолчанию comment будет напечатано поле id . Вставка классов.
Если вы хотите, чтобы в каждом элементе list были разные классы, чтобы вам было проще создавать стили в CSS.(хотя я бы рекомендовал использовать прямые селекторы CSS («>»))
function hierTree($arr, $tag = 'ul', $key = 'comment', $lvl = 0)
{
$tabs = (!$lvl)? '': str_repeat("\t", $lvl);
reset($arr);
echo "$tabs<$tag class=\"depth$lvl\">\n"; // ← The change is there.
while (list(, $v) = each($arr))
{
echo "$tabs\t<li>";
echo "{$v[$key]}";
if (count($v['children']))
{
echo "\n";
hierTree($v['children'], $tag, $key, $lvl +1);
echo "$tabs\t";
}
echo "</li>\n";
}
echo "$tabs</$tag>\n";
}
Эта слегка измененная версия будет печатать глубинаN класс для список элемент,Таким образом, вы можете настроить таргетинг на их * LI * с помощью простого правила CSS, такого как ul.depth1 > li { ...
.