2009-07-08 7 views
5

Je ne sais pas à quel point ce serait simple, mais j'utilise un script qui affiche les fichiers d'un dossier spécifique, mais je voudrais qu'ils soient affichés dans l'ordre alphabétique, serait-il difficile de faire cela? Voici le code que je utilise:PHP (dossier) Liste des fichiers dans un ordre alphabétique?

if ($handle = opendir($mainframe->getCfg('absolute_path') ."/images/store/")) { 
     while (false !== ($file = readdir($handle))) { 
      if ($file != "." && $file != "..") { 
       if (($file != "index.html")&&($file != "index.php")&&($file != "Thumbs.db")) { 
       $strExt = end(explode(".", $file)); 
        if ($strExt == 'jpg') { 
         $Link = 'index.php?option=com_shop&task=deleteFile&file[]='.$file; 
         $thelist .= '<tr class="row0"><td nowrap="nowrap"><a href="'.$Link.'">'.$file.'</a></td>'."\n"; 
         $thelist .= '<td align="center" class="order"><a href="'.$Link.'" title="delete"><img src="/administrator/images/publish_x.png" width="16" height="16" alt="delete"></a></td></tr>'."\n"; 
        } 

       } 
      } 
     } 
     closedir($handle); 
    } 
    echo $thelist; 

:)

Répondre

14

Au lieu d'utiliser readdir vous pouvez simplement utiliser scandir (documentation) qui trie par ordre alphabétique par défaut. La valeur de retour scandir est un tableau au lieu d'une chaîne. Votre code doit donc être légèrement ajusté pour parcourir le tableau au lieu de vérifier la valeur de retour finale null. En outre, scandir prend une chaîne avec le chemin d'accès au lieu d'un descripteur de fichier en entrée, la nouvelle version ressemblerait à quelque chose comme ceci:

foreach(scandir($mainframe->getCfg('absolute_path') ."/images/store/") as $file) { 
    // rest of the loop could remain unchanged 
} 
+0

Ah c'est génial fonctionne comme un charme, merci beaucoup: D – SoulieBaby

+0

Trouvé cette réponse en essayant de résoudre même problème. Merci! Travaillé bien, et avec moins de code! – Agos

+0

Cela a bien fonctionné. Après avoir lu la documentation, j'ai même réussi à inverser l'ordre de tri avec 'SCANDIR_SORT_DESCENDING' comme second argument de' scandir (...) '. Plusieurs autres constantes de tri ont également été documentées dans le lien fourni. –

3

Ce code semble assez désordonné. Vous pouvez séparer la logique de parcours du répertoire avec la présentation. Une version beaucoup plus concise (à mon avis):

<?php 

// Head of page 
$it = new DirectoryIterator($mainframe->getCfg('absolute_path') . '/images/store/')); 

foreach ($it as $file) { 
    if (preg_match('#\.jpe?g$#', $file->getFilename())) 
     $files[] = $file->getFilename(); 
} 
sort($files); 

// Further down 
foreach ($files as $file) 
    // display links to delete file. 
?> 

Vous ne même pas besoin de vous soucier de l'ouverture ou la fermeture de la poignée, et que vous vérifiez le nom du fichier avec une expression régulière, vous ne besoin de l'un des explosions ou des contrôles conditionnels.

+1

Merci de l'essayer :) – SoulieBaby

2

J'aime Glob Il fait lecture du répertoire en un clin d'œil il retourne un tableau qui est facilement classable:

<?php 
$files = glob("*.txt"); 
sort($files); 
foreach ($files as $filename) { 
    echo "$filename size " . filesize($filename) . "\n"; 
} 
?> 
1

Si vous utilisez Joomla1.5, vous devriez utiliser la constante définie JPATH_BASE au lieu de

$mainframe->getCfg('absolute_path') 

Si cela est une extension Joomla que vous distribuerai, ne pas utiliser scandir() comme php5 seulement.

La meilleure chose à faire est d'utiliser l'API Joomla. Il a des classes pour l'accès au répertoire et aux fichiers qui sont superposées pour le faire sur différents réseaux et protocoles. Ainsi, le système de fichiers peut être sur FTP par exemple, et les classes peuvent être étendues pour n'importe quel réseau/protocole.

jimport('joomla.filesystem.folder'); 
$files = JFolder::files(JPATH_BASE."/images/store/"); 
sort($files); 
foreach($files as $file) { 
    // do your filtering and other task 
} 

Vous pouvez également passer une expression régulière comme deuxième paramètre à JFolder :: files() qui filtre les fichiers que vous recevez.

Vous ne souhaitez pas non plus utiliser d'URL comme/administrator/car ils peuvent être modifiés. utiliser les méthodes JURI comme:

JURI :: base();

Si vous voulez vous assurer que des classes CSS Joomla dans les tableaux, pour:

'<tr class="row0">' 

utilisation:

'<tr class="row'.($i&1).'">' 

i $ est le nombre d'itérations.Cela vous donne une séquence d'alternance 0 et 1.

1

Si nous avons des fonctions PHP intégrées, utilisez-les toujours, elles sont plus rapides. Utilisez glob au lieu de parcourir les dossiers, si cela correspond à vos besoins.

$ dossier_names = array(); $ folder_names = glob ('*', GLOB_ONLYDIR + GLOB_MARK + GLOB_NOSORT);

  • returs tout dans le répertoire courant, utilisez chdir() avant de l'appeler retirer le GLOB_ONLYDIR pour inclure des fichiers trop (. serait uniquement les fichiers) GLOB_MARK est d'ajouter une barre oblique aux dossiers noms Supprimer GLOB_NOSORT ne pas trier le tableau
+1

Pas toujours. Si vous avez une API standardisée, utilisez-la. Dans ce cas particulier, le code a été écrit pour le CMS Joomla. Ainsi, il devrait utiliser l'API Joomla. La vitesse est rarement une préoccupation dans le développement web. Un bon design est. – bucabay

Questions connexes