我已启动并运行此递归功能:
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 。
我的问题:我想在最后一次跑步中做一些特别的事情。甚至有办法巧妙地实现这一目标吗?
答案 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