С вашим кодом довольно много проблем (синтаксические ошибки и т. Д.), Поэтому я написал кое-что, что также может упростить код.
Первая часть - индексировать узлы по идентификатору (используяarray_column()
), чтобы при необходимости вы могли напрямую обращаться к каждому элементу по этому идентификатору.Затем передайте в новую функцию makeList()
список узлов, корневой узел и, наконец, флаг, чтобы сказать, что это корневой узел и ему нужны дополнительные теги (подробнее см. Код) ...
// Rebuild nodes array so that it is indexed by id
$nodes = array_column($array['nodes'], null, 'id');
echo makelist($nodes, $nodes['root'], true);
function makeList ( array $nodes, $base, $root = false ) {
// Start by adding start points content
$output = "<li>{$base['content']}</li>";
// If there are sub elements
if ( isset($base['children']) ) {
$output .= "<ul>";
foreach ( $base['children'] as $child ) {
// Add in child elements
$output .= makeList($nodes, $nodes[$child]);
}
$output .= "</ul>";
}
// If the root node, add in wrapping tags
if ( $root ) {
$output = "<ul>$output</ul>";
}
return $output ;
}
Вывод (с вашими данными и форматированием) дает ...
<ul>
<li>Testing Dynalist API</li>
<ul>
<li>create schedule dated tomorrow !(2019-09-26 +07:00)</li>
<ul>
<li>sub list</li>
<li>another sublist</li>
<ul>
<li>**sublist**</li>
</ul>
</ul>
<li>Testing !(2019-09-28)</li>
<li>write something below this</li>
</ul>
</ul>