【问题标题】:Recursive function returns NULL but I can echo or var_dump()递归函数返回 NULL 但我可以回显或 var_dump()
【发布时间】:2018-05-07 17:32:15
【问题描述】:

我有一个这样的嵌套菜单(侧边栏):

$menu = [
    'dashboard' => [
        'type' => 'item',
        'name' => 'bacheca',
        'url' => 'home.php',
    ],
    'administration' => [
        'type' => 'header',
        'name' => 'amministrazione',
        'items' => [
            'configuration' => [
                'type' => 'item',
                'name' => 'configurazione',
                'url' => 'configuration.php',
            ],
            'admins' => [
                'type' => 'item',
                'name' => 'amministratori',
                'url' => 'admins.php',
            ],
            'activities' => [
                'type' => 'item',
                'name' => 'attività',
                'url' => 'activities.php',
            ],
        ],
    ],
    'intranet' => [
        'type' => 'header',
        'name' => 'intranet',
        'items' => [
            'chiefs' => [
                'type' => 'item',
                'name' => 'capiarea',
                'url' => 'chiefs.php',
            ],
            'agents' => [
                'type' => 'item',
                'name' => 'informatori',
                'url' => 'agents.php',
            ],
            'samples' => [
                'type' => 'tree',
                'name' => 'campioni',
                'url' => '#',
                'submenu' => array_merge(
                    [
                        'dummy' => [
                            'type' => 'item',
                            'name' => 'dummy',
                            'url' => 'dummy.php',
                        ],
                    ],
                    [
                        'temperature' => [
                            'type' => 'item',
                            'name' => 'temperature',
                            'url' => 'temperature.php',
                        ],
                    ]),
            ],
            'files' => [
                'type' => 'item',
                'name' => 'riferimenti normativi',
                'url' => 'files.php',
            ],
            'documents' => [
                'type' => 'item',
                'name' => 'documenti',
                'url' => 'documents.php',
            ],
        ],
    ],
];

使用递归函数,我尝试在菜单中找到匹配的“项目”类型并将其返回,以供将来详细说明(不针对类型“标题”和“树”)。这是我写的递归函数:

function item($needle, $haystack, $result = []){
    foreach ($haystack as $key => $value){
        switch ($value['type']) {
            case 'header':
                if (isset($value['items'])){
                    item($needle, $value['items'], $result);
                }
                break;
            case 'tree':
                if (isset($value['submenu'])){
                    item($needle, $value['submenu'], $result);
                }
                break;
            default:
                if ($needle == $key){
                    $result['name'] = $value['name'];
                    $result['url'] = $value['url'];
                    return $result;
                }
        }
    }
}

我不知道为什么,这个函数什么都不返回:如果我输入 var_dump(item('chiefs')); 我希望它返回带有 chief 键的项目,但我什么也没得到

问题在于return 语句:在if ($needle == $key){ .. } 条件下我可以echovar_dump() 匹配数组,但是当我使用return $result 时,它会打印NULL

这是"live" script to play with:我哪里错了?

【问题讨论】:

    标签: php recursion


    【解决方案1】:

    https://www.tehplayground.com/Ix0ODne19Acsjvyx

    问题是

    case 'header':
            if (isset($value['items'])){
                item($needle, $value['items'], $result);
            }
            break;
    case 'tree':
            if (isset($value['submenu'])){
                item($needle, $value['submenu'], $result);
            }
            break;
    

    如果它进入其中任何一个并找到您要查找的内容,则您不会返回任何内容。

    需要保存递归的返回值,如果不为null,则返回,否则继续。

    case 'header':
            if (isset($value['items'])){
                $v = item($needle, $value['items'], $result);
                if ($v) return $v;
            }
            break;
    case 'tree':
            if (isset($value['submenu'])){
                $v = item($needle, $value['submenu'], $result);
                if ($v) return $v;
            }
            break;
    

    【讨论】:

    • 假设你有一个递归函数get_to_0($x) { if ($x == 0) return $x; else get_to_0($x-1); },然后你执行get_to_0(1),它会首先检查$x == 0,因为不是,它会调用get_to_0(0),所以你有堆栈上的两个函数调用f(1) => f(0)f(0)0 返回到f(1),但f(1) 不会向其调用者返回任何内容,因为在elsef(1) 部分中没有@ 987654335@。相反,如果我们有get_to_0($x) { if ($x == 0) return $x; else return get_to_0($x-1); },那么f(0) 返回0,而f(1) 返回0,因为它传递f(0) 返回
    • 您的代码说 5 次调用深度,并且您找到了您要查找的内容,因此您返回该值。现在您的代码深度为 4 次调用,并且您位于 case: 'header' 中。然后,您的代码从这里跳出 for 循环并且不返回任何内容。您找到的项目不会通过调用树传播回来
    猜你喜欢
    • 2019-05-30
    • 1970-01-01
    • 2022-06-29
    • 2018-11-13
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多