6

以下のような再帰関数があります。

public function findnodeintree($cats,$cat_id)
{       
    foreach($cats as $node)
    {                   
        if((int)$node['id'] == $cat_id)
        {       
            echo "finded";
            $finded = $node;
            break;
        }
        else
        {
            if(is_array($node) && array_key_exists('children', $node)){ 
                $this->findnodeintree($node['children'],$cat_id);
            }
        }           
    }
    return $finded;
}

例えば

$node =$this->findnodeintree($category_Array, 169);

それは私に与えた

"founded"

PHP エラーが発生しました

Severity: Notice

Message: Undefined variable: finded

配列構造は次のようなものです

    [0] => Array
    (
        [id] => 0
        [name] => MAIN CATEGORY
        [depth] => 0
        [lft] => 1
        [rgt] => 296
        [children] => Array
            (
                [0] => Array
                    (
                        [id] => 167
                        [name] =>  CAT 0
                        [depth] => 1
                        [lft] => 2
                        [rgt] => 17
                        [children] => Array
                            (
                                [0] => Array
                                    (
                                        [id] => 169
                                        [name] =>   CAT 1
                                        [depth] => 2
                                        [lft] => 3
                                        [rgt] => 4
                                    )

                                [1] => Array
                                    (
                                        [id] => 170
                                        [name] =>   CAT 2
                                        [depth] => 2
                                        [lft] => 5
                                        [rgt] => 10
                                        [children] => Array
                                            (
                                                [0] => Array
                                                    (
                                                        [id] => 171
                                                        [name] =>    CAT 5
                                                        [depth] => 3
                                                        [lft] => 6
                                                        [rgt] => 7
                                                    )

                                                [1] => Array
                                                    (
                                                        [id] => 172
                                                        [name] =>    CAT 3
                                                        [depth] => 3
                                                        [lft] => 8
                                                        [rgt] => 9
                                                    )

                                            )

                                    )
4

3 に答える 3

12

再帰から正しい値を取得するには、再帰呼び出しで戻り値を破棄してはなりません。また、ヒットしたらすぐに再帰ツリーを遡り、実際に一致するノードを返す必要があるため、その時点でもループを中断する必要があります。

そうしないと、後続の再帰呼び出しによって変数が上書きされ、間違ったノード、falseまたはnullが返されます。

これが機能するはずです:

public function findnodeintree($cats,$cat_id)
{       
    foreach($cats as $node)
    {                   
        if((int)$node['id'] == $cat_id){       
            return $node;
        }
        elseif(array_key_exists('children', $node)) {
            $r = $this->findnodeintree($node['children'], $cat_id);
            if($r !== null){
                return $r;
            }
        }           
    }
    return null;
}

注:is_arrayその時点で$node配列でなければならないか、最初の分岐条件でエラーをスローする必要があるため、を削除しました。

于 2013-01-29T14:27:12.190 に答える
5

再帰行を次のように変更します。

 $finded = $this->findnodeintree($node['children'],$cat_id);

関数をリコールする場合、その行は変数を埋める必要があります。そうしないと、最後に発生した状況で埋められますが、最初の呼び出しに結果が返されることはありません。

したがって、$finded最初の呼び出しでは空または存在しません。

于 2013-01-29T14:03:56.433 に答える
0

再帰呼び出しfindnodeintreeは特定のループを通過しますが、何も「検出」されませんが、変数 $finded が返されます。ループ内で見つからなかったため、その変数は実際には宣言されていません。これを試して:

public function findnodeintree($cats,$cat_id)
{       
    $finded = NULL;
    foreach($cats as $node)
    {                   
        if((int)$node['id'] == $cat_id)
        {       
            echo "finded";
            $finded = $node;
            break;
        }
        else
        {
            if(is_array($node) && array_key_exists('children', $node)){ 
                $this->findnodeintree($node['children'],$cat_id);
            }
        }           
    }
    return $finded;
}
于 2013-01-29T14:04:47.477 に答える