在PHP递归函数中,如何检查它是否是最后一次迭代?

时间:2019-10-11 08:47:35

标签: php recursion

我已启动并运行此递归功能:

function my_function($a, $b, $level=0){


    $items = get_some_items($a, $b);

    $fh = fopen($fpath, 'a+');

    foreach($items as $item){
        fwrite($fh, "Some info related to $item");

        if( /* $item has something special */ ){

            my_function($a, $item, $level++);
        }
    }


    if( /* we a re at the last recursion */ ){
        //do something extra special;
        //e.g. fwrite($fh, "This is the end of the file");
    }


    fclose($fh);

}

有了这个,我可以知道哪个迭代是第一次运行。我还可以在任何级别上运行 nth

我的问题:我想在最后一次跑步中做一些特别的事情。甚至有办法巧妙地实现这一目标吗?

3 个答案:

答案 0 :(得分:1)

您可以在末尾添加一个新参数,该参数仅在您所使用的项目号与项目总数相同时才返回true。

老实说,该功能让我有些困惑,因为它似乎并不在乎第一级和最后一级。因此,我假设此函数只关心最后一个项目,只要它具有父项即可。

function my_function($a, $b, $level=0,$isLast=false){
    if($isLast){
        // Do something special on last item
    }
    $items = get_some_items($a, $b);    
    $total = count($items);
    $c=0;
    foreach($items as $item){
        $c++;
        my_function($a, $item, $level++,($c==$total));
    }

    // Additional check maybe to see if the first ever call is also the last?
    if($total==0 && $level<1){
        // Do something special on last item?
        // This could be at the top in the same IF statement
        // as the $isLast check (preferred) if things were moved around.
    }
}

答案 1 :(得分:1)

只需检查您是否在叶子节点上

function my_function($a, $b, $level=0){
    $items = get_some_items($a, $b);
    if ($items) {
        foreach($items as $item){
            if( /* $item has something special */ ){
                my_function($a, $item, $level++);
            }
        }
    } else {
        /* we are at the last recursion */ 
        do_something_extra_special();
    }
}

答案 2 :(得分:0)

您的$level被奇怪地传递为$level++,它在您的foreach循环中每次都会增加。通常,当您希望在递归函数调用中具有级别指示器时,对其自身的所有子序列调用都将收到当前级别+ 1的级别指示器。

如果是这样,则您的第一个递归深度将始终具有$level的{​​{1}}。您可以简单地检查0并了解它是否是最外层调用中主循环的结尾。

$level