Оптимизация нерекурсивной функции - PullRequest
1 голос
/ 18 апреля 2009

У меня есть эта функция, основные операции которой изложены следующим образом:

function render($index) {
    foreach($things[$index] as $key => $data) {
        echo '<div>';
        /* irrelevant operations */
        if(isset($data['id'])) {
            echo '<div class="wrap">';
            render($things[$data['id']]);
            echo '</div>';
        }
        echo '</div>';
    }
}

Не могу на всю жизнь сообразить, как оптимизировать эту функцию; Боюсь, что PHP взорвется, если стек вызовов станет слишком большим.

Есть ли способ оптимизировать эту функцию?

Ответы [ 4 ]

9 голосов
/ 18 апреля 2009

Весьма сомнительно, что вам нужно беспокоиться. Если вы вкладываете div достаточно глубоко, чтобы стек вызовов заполнялся, глубина рекурсии меньше всего вас беспокоит.

3 голосов
/ 18 апреля 2009

Этот код не тестировался, но, из головы в голову, итеративная функция должна выглядеть примерно так:

function render($index){
    $stack = array();
    array_push($index);

    $pre = '';
    $post = '';

    while(!empty($stack)){
        $idx = array_pop($stack);

        foreach($things[$idx] as $key => $value){
            $pre .= '<1>';
            $spost = '';

            if(isset($data['id'])){
                $pre .= '<2 class="wrap">';
                $spost .= '</2>';

                $stack[] = $things[$data['id']];
            }

            $spost .= '</1>';
            $post .= $spost;
        }
    }

    return $pre . $post;
}
3 голосов
/ 18 апреля 2009

Вам НЕ НУЖНО использовать рекурсию для прохождения вашего дерева в глубину; это просто очень хорошо работает. Если вы хотите потерять свой стек, вы можете просто запустить длинный цикл для всех ваших элементов, удерживая только последние и текущие позиции. Хотя рекурсия - это более простой и (в общем) лучший способ выполнить обход в глубину.

3 голосов
/ 18 апреля 2009

То, что вы делаете, - это эффективный обход дерева. По сути, это не хуже, чем просто распечатать все значения в дереве. Были ли у вас какие-то особые проблемы, когда он становился слишком большим? Насколько глубоко вложено это дерево?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...