2010-10-20 13 views
4

Ce que je cherche est comment construire une fonction qui prend un dossier enfant en boucle à travers et en arrière dans la hiérarchie des répertoires pour trouver le premier fichier correspondant qui est spécifié.Comment créer une boucle arrière pour trouver le premier fichier correspondant

Un exemple est que je permet de dire que j'ai la structure de répertoire: Accueil/Dossier 1/Dossier 2/Dossier 3

Je suis à la recherche du fichier style.css.

Je voudrais commencer à pointer vers le dossier enfant (dossier 3) et chercher le style.css et si ce n'est pas là il continuerait vers le dossier parent (dossier 2) et ainsi de suite. Mais il ne devrait pas aller plus loin que le dossier 1.

Si quelqu'un a une bonne idée de comment faire cela, je serais très reconnaissant!

Répondre

3

Un moyen rapide et sale serait:

function traverse_backward($filename, $path, $min_depth) { 
    // $path = '/home/user/projects/project1/static/css/'; 
    // $min_depth - the minimum level of the path; 
    // $filename - the file name you are looking for, e.g. 'style.css' 
    $path_parts = explode('/',$path); 
    while (count($path_parts) > $min_depth) { 
     $real_path = implode($path_parts,'/').'/'; 
     if (is_file($real_path.$filename)) { 
      return $real_path; 
     } 
     array_pop($path_parts); 
    } 

    return false; 
} 
traverse_backward('t.php', '/home/user/projects/test-www/static/css', 3); 
+0

Merci beaucoup pour la réponse rapide, c'était exactement ce que je cherchais. –

0

Ceci est une fonction récursive simple (vous avez un nombre limité d'itérations possibles, donc il n'y aura pas de frais généraux). Le pseudo-code est comme ceci:

function lookForCss($from) { 
    if(from contains css file) { 
    return $from; 
    } 
    //else 
    $from = go up one folder($from); 
    return lookForCss($from); 
} 
1

D'autres explications pour la réponse poing: Lorsque vous travaillez avec des chemins en PHP, il est commode d'exploser() le chemin dans un tableau. Il est plus facile de travailler avec des chemins s'ils sont dans un tableau. Dans ce cas, vous utilisez array_pop() pour supprimer le dernier élément du tableau à chaque itération de la boucle. Ensuite, vous pouvez utiliser implode() sur le chemin pour le remettre dans une chaîne, la chaîne peut être utilisée avec des fonctions de fichier telles que file_exists().