Ходьба по дереву в ширину при ошибке Symfony

В 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("&emsp;", $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("&emsp;", $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", затем их дочерние узлы листьев, затем их дочерние элементы, которые родительские узлы других листьев, а затем эти конечные узлы).

Есть ли у вас какие-либо предложения относительно того, чего мне не хватает, чтобы заставить его работать при возврате разметки как переменной?

0 ответов

Другие вопросы по тегам