Повторно правильно - PullRequest
1 голос
/ 07 мая 2009

У меня есть несколько функций, связанных с навигацией, и я не хотел бы иметь ограничений по глубине. Они генерируют меню CSS, цепочки крошек и тому подобное.

Я поставлен в тупик относительно того, как заставить функции следовать каждому пути к глубине или к корню без явного зацикливания.

Ниже приведен типичный пример, когда мне нужен самый верхний родительский элемент страницы. Самый верхний будет иметь значение ноль в своем поле parent.

Вот явно зацикленная версия:

function topPg() {
    $p = $this->retrieve("id = '$this->parent'");
    if ($p->parent != 0) {
        $gp = $this->retrieve("id = '$p->parent'");
        if ($gp->parent != 0) {
            $ggp = $this->retrieve("id = '$gp->parent'");
            if ($ggp->parent != 0) {
                $gggp = $this->retrieve("id = '$ggp->parent'");
                // ad naseum
            } else {
                return $ggp;
            }
        } else {
            return $gp;
        }
    } else {
        return $p;
    }
} // func

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

Ответы [ 3 ]

8 голосов
/ 07 мая 2009

Это легко выразить как цикл while:

$node = $this;
while ($node->parent != 0) {
  $node = $this->retrieve("id = '$node->parent'");
}

$node теперь содержит самый верхний элемент.

1 голос
/ 07 мая 2009

Welbog's ответ самый хороший, но для полноты я добавлю еще одно рекурсивное решение:

function topPg() {
   function foo($p) {
     $gp = $this->retrieve("id = '$p->parent'");
     return ($gp->parent == 0) ? $p : foo($gp);
   }  

   return foo($this);
}
0 голосов
/ 07 мая 2009

Я не проверял, но он должен работать ..:

function recurse( $pg )
{
    $parent_pg = $pg->retrieve( 'id = ' . $this->parent );

    if( $parent_pg->parent != 0 )
    {
        recurse( $parent_pg );
    }
    else
    {
        return $pg;
    }

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