2009-06-18 6 views
2

J'ai une fonction qui, avec un nom de fichier et un chemin de répertoire, vérifie si le répertoire contient déjà un fichier avec le même nom et retourne un nom de fichier modifié (en ajoutant un une partie du nom de fichier). (La fonction get_filenames() est une fonction auxiliaire CodeIgniter qui crée un tableau de tous les noms de fichiers dans le répertoire spécifié.)La fonction PHP ne renvoie pas de valeur

Lorsque j'essaie d'imprimer le résultat renvoyé de l'appel de fonction, je n'ai rien; mais si j'imprime $ new_filename dans l'instruction else {} de la fonction elle-même, alors il suffit d'appeler la fonction (plutôt que d'en imprimer la valeur), ça marche!

Je dois retourner la valeur dans la fonction, ne pas l'imprimer, car j'ai vraiment besoin d'affecter le résultat à une variable pour un traitement ultérieur. (Dans l'exemple ci-dessous, je viens imprimais le résultat de l'appel de fonction pour démontrer le point.)

La fonction:

function avoid_conflicting_filenames($old_filename, $new_filename, $dir, $count) 
{ 
    $num = ''; 
    if ($count > 0): 
     $num = $count; 
    endif; 

    $filename_arr = explode('.', $old_filename, -1); 
    $new_filename = $filename_arr[0] . $num . '.' . $filename_arr[1]; 

    if (in_array($new_filename, get_filenames($dir))):  
     $count++; 
     avoid_conflicting_filenames($old_filename, $new_filename, $dir, $count); 
    else: 
     return $new_filename; 
    endif; 
} 

Et où j'appelle la fonction:

print avoid_conflicting_filenames('file.jpg', '', 'path/to/file', 0); 

Cela m'a rendu fou pour le jour passé, donc toute aide serait grandement appréciée! Merci.

Répondre

10

Remplacer ceci:

avoid_conflicting_filenames($old_filename, $new_filename, $dir, $count); 

Avec ceci:

return avoid_conflicting_filenames($old_filename, $new_filename, $dir, $count); 

Vous ne pensez pas à ce récursive. Vous devez renvoyer la valeur de retour de la fonction.

Passé, qu'est-ce qui se passe avec la syntaxe if? Je le tolère à l'intérieur des modèles, mais pour le code? ew.

Si je comprends bien le code correctement, vous pouvez également réécrire cette fonction pour éviter récursion comme ceci:

function avoid_conflicting_filenames($old_filename, $new_filename, $dir) { 
    $num = 0; 
    $files = get_filenames($dir); 
    $filename_arr = explode('.', $old_filename, -1); 
    do { 
     $new_filename = $filename_arr[0] . $num . '.' . $filename_arr[1]; 
     $num++; 
    } while(in_array($new_filename, $files)); 
    return $new_filename; 
} 

Je pense que cela est plus agréable et un peu plus facile à obtenir, mais il est à vous ...

2

Changer votre code:

function avoid_conflicting_filenames($old_filename, $new_filename, $dir, $count) 
{ 
    $num = ''; 
    if ($count > 0): 
     $num = $count; 
    endif; 

    $filename_arr = explode('.', $old_filename, -1); 
    $new_filename = $filename_arr[0] . $num . '.' . $filename_arr[1]; 

    if (in_array($new_filename, get_filenames($dir))):   
     $count++; 
     return avoid_conflicting_filenames($old_filename, $new_filename, $dir, $count); 
    else: 
     return $new_filename; 
    endif; 
} 

Vous avez oublié le statment de retour lors de l'appel avoid_conflicting_filenames à l'intérieur de avoid_conflicting_filenames.

0

Vous exécutez la fonction de manière récursive. Vous devrez passer le résultat à l'instance « parent » de la fonction:

if (in_array($new_filename, get_filenames($dir))):   
    $count++; 
    // Note "return" statement below. 
    return avoid_conflicting_filenames($old_filename, $new_filename, $dir, $count); 
else: 
    return $new_filename; 
endif; 
0

Si la première branche dans votre seconde si on prend la fonction rencontre jamais une déclaration de retour.

Modifier à lire:

if (in_array($new_filename, get_filenames($dir))):   
    $count++; 
    //Added return 
    return avoid_conflicting_filenames($old_filename, $new_filename, $dir, $count); 
else: 
    return $new_filename; 
endif; 
Questions connexes