В Symfony (3.4) я установил древовидную структуру в многомерном массиве с 3 слоями узлов, последний из которых является листовым. Моя проблема возникает в попытке настроить функцию обхода дерева в ширину в качестве службы:
<?php
namespace AppBundle\Service;
use AppBundle\Service\TreeBuilder;
class TreeBuilder {
//...
$public function outputTree($tree, $level = 0, &$markup = ''){
$queue = new \SplQueue();
if($level == 0){
//Building a select menu with the tree
$markup .= '<select>';
}
foreach ($tree as $node){
if(!isset($node['children'])){
$markup .= '<option>'.str_repeat(" ", $level).$node['title'].'</option>';
}
elseif(isset($node['children'])){
$queue->enqueue();
}
}
//Only once done with echoing leaf nodes, then move on to the queue
while ($queue->count()){
$dump = $queue->dequeue();
$markup .= '<option>'.str_repeat(" ", $level).$dump['title'].'</option>';
$markup .= $this->outputTree($dump['children'], $level + 1, $markup);
}
return $markup;
}
}
Теперь, когда я пытаюсь использовать службу в моем контроллере (и, наконец, объединить с '</select>'
) Я получаю OutOfMemoryException именно из-за строки:
$markup .= $this->outputTree($dump['children'], $level + 1, $markup);
Когда я пытаюсь рекурсии с помощью echo
вместо разметки $ все классы располагаются в соответствии с ожиданиями (сначала родители «уровня 0», затем их дочерние узлы, потом их дочерние узлы, а затем эти конечные узлы).
Есть ли у вас какие-либо предложения относительно того, чего мне не хватает, чтобы заставить его работать при возврате разметки как переменной?
Задача ещё не решена.
Других решений пока нет …