Рекурсивная функция в PHP - как не вернуть false? - PullRequest
0 голосов
/ 25 октября 2011

Я никогда раньше не использовал рекурсию в PHP, поэтому я новичок в этом - у меня следующая проблема.Функция WordPress должна возвращать идентификатор термина верхнего уровня данного идентификатора дочернего термина - термины могут иметь родителей 1..n, поэтому здесь может оказаться полезной рекурсивная функция.

// recursive function
function return_top_level_term($term_id,$taxonomy_name) {
    $term = get_term_by('id',$term_id,$taxonomy_name);
    if($term->parent>0) {
        return_top_level_term($term->parent,$taxonomy_name);
    } else {
            // here we get the correct value
        return $term->term_id;
    }
}

PHP действительно НАХОДИТправильный term_id, но функция всегда возвращает false.

$my_top_level_term = return_top_level_function(423,$tax);

Пример с тремя слоями, неформальная запись:

return_top_level_term(return_top_level_term(return_top_level_term(return 1;)return false;) return false;)

Я ищу 1, но всегда возвращается false, хотяфункция не имеет возвращаемого значения.

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

Ответы [ 3 ]

6 голосов
/ 25 октября 2011

измените эту строку

        return_top_level_term($term->parent,$taxonomy_name);

на

return return_top_level_term($term->parent,$taxonomy_name);

, иначе последний результат не будет возвращен верхней функции в стеке, и возвращение будет недействительным

0 голосов
/ 25 октября 2011

Вы не возвращаете значение при рекурсивном вызове функции.

У вас должно быть return return_top_level_term($term->parent,$taxonomy_name); (обратите внимание на дополнительный возврат)

0 голосов
/ 25 октября 2011
// recursive function
function return_top_level_term($term_id,$taxonomy_name) {
    $term = get_term_by('id',$term_id,$taxonomy_name);
    if($term->parent>0) {
        return return_top_level_term($term->parent,$taxonomy_name);
    } else {
        return $term->term_id;
    }
}

Возможно, вы пропустили ответное заявление?

Это также можно записать как:

// recursive function
function return_top_level_term($term_id,$taxonomy_name) {

    $term = get_term_by('id',$term_id,$taxonomy_name);

    if($term->parent>0) {
        return return_top_level_term($term->parent,$taxonomy_name);
    }

    return $term->term_id;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...