2010-01-21 4 views
1

J'ai construit une fonction qui prend un nom de fichier, et incrémente un compteur dans le nom de fichier et le renvoie, cependant, tout est correct, sauf que le retour ne retourne pas le nom du fichier.Fonction PHP ne renvoyant pas la chaîne

Toute aide, s'il vous plaît?

Mon code:

$filename = join("", array_reverse($date)); 
$filename .= ".xml"; 
$dir = "../gigs"; 
$file = $dir."/".$filename; 

function getNewFileName($filename, $dir) { 
if (is_file("$dir/$filename")) { 
    if (strpos($filename, "_") === false) { 
     $filename = str_replace(".xml","_1.xml",$filename); 
     getNewFileName($filename, $dir); 
    } 
    else { 
      $pos = strpos($filename, "_"); 
      $counter = (int)substr($filename, $pos+1,1); 
      $counter++; 
      $filename = substr($filename,0, $pos)."_".$counter.".xml"; 
      getNewFileName($filename, $dir); 
     } 
    } else { 
       // echoing HERE shows that the string is manipulated correctly 
     return (string)$filename; // but returning here is not working 
    } 
} 

echo getNewFileName($filename, $dir); // <- this last line prints nothing out 

Merci à l'avance.

+0

quelle est la valeur de $ filename et $ dir vous saisissez? – Natrium

+5

Une instruction 'return' manquante? – Gordon

+0

Je n'ai qu'une seule instruction 'return', parce que c'est une fonction récursive, quand j'écho' $ filename' juste avant le 'return', la chaîne est correcte à 100%, mais le résultat ne retourne pas la valeur. –

Répondre

11

La ligne:

getNewFileName($filename, $dir); 

a besoin d'un return:

return getNewFileName($filename, $dir); 
+0

En fait, les deux occurrences de cette ligne le font. – Gareth

+0

Merci beaucoup! Je ne comprends pas vraiment pourquoi ça marche, est-ce que tu veux bien me l'expliquer? –

+3

Vous effectuez un appel de fonction récursif. Si vous ne renvoyez pas sa valeur de retour dans la pile, le scénario de base n'évaluera jamais vrai. –

1

C'est ce que votre fonction devrait ressembler à:

function getNewFileName($filename, $dir) { 
    if (is_file("$dir/$filename")) { 
     if (strpos($filename, "_") === false) { 
      $filename = str_replace(".xml","_1.xml",$filename); 
      return getNewFileName($filename, $dir); 
     } 
     else { 
       $pos = strpos($filename, "_"); 
       $counter = (int)substr($filename, $pos+1,1); 
       $counter++; 
       $filename = substr($filename,0, $pos)."_".$counter.".xml"; 
       return getNewFileName($filename, $dir); 
     } 
    } 
    return (string)$filename; 
} 

echo getNewFileName($filename, $dir); // <- this last line prints nothing out 
0

Tout d'abord, s'il vous plaît essayer de formater votre code pour que les tirets sont lisibles. Deuxièmement, vous êtes tout simplement pas revenir des appels récursifs à getNewFileName():

function getNewFileName($filename, $dir) { 
    if (is_file("$dir/$filename")) { 
    if (strpos($filename, "_") === false) { 
     $filename = str_replace(".xml","_1.xml",$filename); 
     return getNewFileName($filename, $dir); // here 
    } else { 
     $pos = strpos($filename, "_"); 
     $counter = (int)substr($filename, $pos+1,1); 
     $counter++; 
     $filename = substr($filename,0, $pos)."_".$counter.".xml"; 
     return getNewFileName($filename, $dir); // and here 
    } 
    } else { 
    return (string)$filename; 
    } 
} 

en supposant que est votre intention.

-1
function getNewFileName($filename, $dir) { 
    if (is_file("$dir/$filename")) { 
    if (strpos($filename, "_") === false) { 
     $filename = str_replace(".xml","_1.xml",$filename); 
     return (string)$filename; 
    } else { 
     $pos = strpos($filename, "_"); 
     $counter = (int)substr($filename, $pos+1,1); 
     $counter++; 
     $filename = substr($filename,0, $pos)."_".$counter.".xml"; 
     return (string)$filename; 
    } 
    } else { 
    return (string)$filename; 
    } 
} 

Votre fonction avait une boucle à l'infini.

+0

Il n'a pas bouclé à l'infini, car l'appel de fonction interne utilisait la modification des arguments avant de les transmettre à la fonction externe appelez – Gareth

+0

Vous avez raison, désolé. – Thomas

Questions connexes