2010-07-15 4 views
2

Je me connecte à un serveur ftp et affiche tous les éléments dans une liste. Je veux que cette liste soit classée par ordre alphabétique.PHP: tableau de tri - liste des fichiers ftp?

ne devrait pas le faire?

 // get contents of the current directory 
    $contents = ftp_nlist($conn_id, $path); 
    sort($contents); 

c'est une partie du script!

// get contents of the current directory 
$contents = ftp_nlist($conn_id, $path); 
sort($contents); 
print "<ul class='server_list'>"; 
foreach ($contents as $value) { 
    $line = str_replace($path, "", $value); 
    $ext = pathinfo($line, PATHINFO_EXTENSION); 
    if (strlen($ext) > 0) { //File 
     print "<li class='file'>"; 
     print "<a href='d.php/?p=". $path . $line."'>$line</a>"; 
     print "</li>"; 
    } else { //Folder 
     print "<li class='folder'>"; 
     print "<a href='?p=". $path . $line."'>$line</a>"; 
     print "</li>"; 
    } 
} 
print "</ul>"; 

En outre, je voudrais avoir tous les dossiers en haut. de sorte que tous les dossiers doivent être classés par ordre alphabétique et par la suite tous les fichiers doivent être répertoriés dans abc ...

print_r($contents) avant le tri me donne:

Array ( 
    [0] => /userupload/OrderNo_100750_HT 
    [1] => /userupload/README.txt 
    [2] => /userupload/anotherfolder 
    [3] => /userupload/avatar.jpg 
    [4] => /userupload/subfolder1 
) 
+0

Est-ce que ça marche ou pas? Il semble que ça devrait. Si ce n'est pas le cas, quel est le problème? – deceze

+0

ça ne marche pas! sinon je ne poserais pas la question! Je pensais que je devrais le faire! – matt

+1

pouvez-vous afficher le code où vous affichez le tableau $ contents, le problème pourrait être – bumperbox

Répondre

0

Vous aurez besoin de deux matrices. Un avec les répertoires et un avec les fichiers. Ensuite, trier chacun.

Le problème est que vous n'avez pas de fonction en PHP pour tester la météo d'un fichier ou d'un fichier.

Voici la solution de contournement, qui pourrait être trouvée à php.net:

function ftp_is_dir($dir, $ftpcon) { 
    // get current directory 
    $original_directory = ftp_pwd($ftpcon); 
    // test if you can change directory to $dir 
    // suppress errors in case $dir is not a file or not a directory 
    if (@ftp_chdir($ftpcon, $dir)) { 
     // If it is a directory, then change the directory back to the original directory 
     ftp_chdir($ftpcon, $original_directory); 
     return true; 
    } 
    else { 
     return false; 
    }   
} 

Avec cela, vous pouvez faire:

// get contents of the current directory 
$contents = ftp_nlist($conn_id, $path); 
$dirs = array(); 
$files = array(); 
foreach ($contents as $value) { 
    if (ftp_is_dir($value, $conn_id)) $dirs[] = $value; 
    else $files[] = value; 
} 
$contents = array(); 
sort($dirs); 
sort($files); 
$contents = array_merge ($dirs, $files); 
... 
+0

$ ftpcon est $ conn_id dans votre cas. – JochenJung

+0

Je préférerais une version sans 'global'. – deceze

+0

Ok, je l'ai juste changé pour travailler sans global – JochenJung

1

Vous avez raison, pour une raison, il ne semble pas avoir n'importe quel effet. La raison est simple: Le tri est sensible à la casse.. Et compte tenu de cela, le tableau est déjà trié (les minuscules viennent après les majuscules).

Si vous voulez avoir une sorte de casse, vous pouvez utiliser natcasesort():

natcasesort($contents); 
print_r($contents); 

donne

Array 
(
    [2] => /userupload/anotherfolder 
    [3] => /userupload/avatar.jpg 
    [0] => /userupload/OrderNo_100750_HT 
    [1] => /userupload/README.txt 
    [4] => /userupload/subfolder1 
) 
0

Pour commencer, natcasesort triera dans "l'ordre naturel", Case- insensible.

Pour trier les dossiers vers le haut, vous devez demander au serveur FTP s'il s'agit d'un dossier, puis le placer dans un tableau séparé et fusionner les deux tableaux par la suite. Il semblerait que l'utilisation de ftp_rawlist et l'analyse du résultat serait le meilleur moyen de le faire.