J'ai cette fonction récursive en marche et en cours d'exécution: avec ceci, je peux dire quelle itération est la première exécution. Je peux également obtenir le Ma question: J'aimerais faire quelque chose de spécial pendant la dernière course. Y a-t-il même un moyen de réaliser soigneusement cela? P> p>
3 Réponses :
Vous pouvez ajouter un nouveau paramètre à la fin qui ne renvoie que true si le numéro d'article que vous êtes sur le nombre est identique au nombre total d'éléments.
Si je suis honnête, la fonction est un peu déroutante pour moi, car elle ne semble pas se soucier si le niveau est à la fois le premier et le dernier. Je suppose donc que cette fonction ne se soucie que du dernier article tant que cela a un parent. P>
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.
}
}
Je pense que le problème avec le booléen ($ c == $ Total) code> est qu'il y aura plusieurs niveaux auquel $ islast code> évaluera à vrai code>. N'oubliez pas, nous ne sommes pas simplement en boucle avec foreach code>, nous faisons également une récursion.
Vérifiez simplement si vous êtes sur un nœud de feuille:
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();
}
}
@Guillero, pourriez-vous jeter une lumière sur la réponse. Pour commencer, pardon mon ignorance, mais ce qui est même un "nœud de feuille" dans cette situation?
La récursion est souvent utilisée pour traverser un arbre de données. Vous démarrez le «coffre», puis à chaque point que vous traversez chaque branche ($ articles) jusqu'à ce que vous frappiez un point où il ne reste plus de branches, c'est-à-dire les feuilles de l'arbre. Chaque point était que vous avez été divisé en branches s'appelle un nœud. Donc, un «nœud de feuille» est la fin de la récursion.
Votre Si tel est le cas, votre première profondeur de récursion aurait toujours un $ NIVEL CODE> est étrangement transmis comme $ niveau ++ code>, qui incrémenterait à chaque fois dans votre foreach code>. Habituellement, lorsque vous souhaitez avoir un indicateur de niveau dans une fonction de fonction récursive, tous les appels de remplaçant à elle-même recevraient un indicateur de niveau du niveau de courant + 1. $ niveau code> de 0 code>. Vous pouvez simplement vérifier le niveau $ CODE> et apprendre s'il s'agit de la fin de la boucle principale de votre appel le plus externe. P>
Connexe: Stackoverflow.com/questions/1070244/...
Utilisez Compter les éléments et ajoutez un autre param que vous passez avant le dernier appel
Même chose que vous le faites avec
niveau code>, vous pouvez injecter un paramètre indiquant le dernier appel. Voulez-vous connaître le dernier appel à l'intérieur de la boucle de Forache et la dernière invocation demy_function code> dans la pile récursive?Comment connaissez-vous le nombre de fois que votre fonction va courir? Si vous ne pouvez pas, l'ajout d'une variable de comptage supplémentaire ne vous aide pas vraiment.
Quel est le "quelque chose de spécial" que vous aviez prévu de faire dans la dernière itération, de toute façon?
@Koalayeung. Votre commentaire / question est un très bon. Nope, je ne connais pas le nombre de fois où la fonction va courir. Pour aussi longtemps que
get_some_items () code> renvoie tous les éléments, nous devons les boucler et exécutermy_function code> sur chaque élément.@Koalayeung, pour répondre à votre question sur "quelque chose de spécial", j'ai modifié le code, ajoutant les fonctions du système de fichiers. (C'est-à-dire que je dois écrire quelque chose dans un fichier texte).
@Ifediokonkwo: par "Dernière récursion", voulez-vous dire la fin de la boucle principale de votre appel de fonction ultérieure? Ou voulez-vous dire le dernier appel de récursions intérieure? Ou voulez-vous dire le dernier appel de récursivité interne avec la profondeur de récursion la plus profonde?