Lister dossier par ordre de modification

WRInaute impliqué
Bonjour,

Voila, dans la partie admin de mon site je peu uploader des images dans un répertoire et en lister le contenu avec cette fonction :

Code:
function list_files() {
    global $the_path;

        $handle = dir($the_path);
        print "\n      <b>Fichiers uploadés :</b><br />\n      <ul>";
        while ($file = $handle->read()) {
                if (($file != ".") && ($file != "..")) {
                        print "\n       <li><a href=\"http://www.blind-guardian.fr/pics/news/" . $file ."\" target=\"_blank\">http://www.blind-guardian.fr/pics/news/" . $file ."</a> <em>(" . dd(filemtime($the_path.$file)) . ")</em></li>";
           }
        }
        print "\n      </ul>\n      <br /><hr /><br />";
}

Seulement l'affichage se fait par ordre alphabétique et je voudrais le modifier un peu pour le faire apparaitre par ordre de modification seulement je n'ai pas trouvé comment faire.

Si quelqu'un pouvait m'aider cela me simplifierai grandement les choses :)
 
WRInaute discret
Et bien, voilà :)
Code:
<?php
function dir_sort_by_update_date($dir_path, $order=true){
  $dir_cont = scandir($dir_path);
  $dir_tempo = array();
  foreach($dir_cont as $file){
    if($file != '.' && $file != '..'){
      $dir_tempo[$file] = filemtime($dir_path . $file);
    }
  }
  if($order){
    asort($dir_tempo);
  }else{
    arsort($dir_tempo);
  } 
  return $dir_tempo;
}
$dir_path = '/home/user/dir/';
$dir_sorted = dir_sort_by_update_date($dir_path);
print_r($dir_sorted);
?>

Le code me parait assez simple et clair. Tu appelles la fonction dir_sort_by_update_date en lui donnant le chemin et éventuellement un boolean pour classer les fichier par ordre croissant/décroissant.

Il me semble facile de le modifier pour pouvoir gérer une arborescence (des sous-dossiers).
Il n'y a pas non plus de gestion de vérification des droits.
 
WRInaute impliqué
Merci mais je dois être très mauvais car je n'arrive pas à le faire fonctionner :?

J'ai testé directement sur une page brut, en copiant tel quel le code et cela ne marche pas.
 
WRInaute discret
Tu as bien changé le chemin (variable $dir_path) ?

Si c'est le cas, as-tu un message d'erreur ? Es-tu sur que ton répertoire existe et qu'il y a quelque chose dedans ?
 
WRInaute impliqué
Oui oui, j'ai bien changé le chemin, le dossier existe avec des images dedans et je n'ai aucun message d'erreur, juste une page blanche.
 
WRInaute discret
T'utilises php5 ?

rajoutes :
Code:
$dirtest = scandir($dir_path);
foreach($dirtest as $dir){
  echo $dir . '<br />';
} 
echo is_callable('scandir').'<br />';
echo is_callable('asort').'<br />';
echo is_callable('arsort').'<br />';

à la fin du code et dis moi ce qui s'affiche.
 
WRInaute impliqué
Au final j'ai réussi en fouinant beaucoup plus profond sur google.

Je le met donc pour ceux intéressés, ont ne sait jamais :

Code:
function list_files() {
    global $the_path;
    $rep = $the_path;
    $dir = opendir($rep);
    $toplk = array();
        print "\n      <b>Fichiers uploadés :</b><br />\n      <ul>";
        while ($f = readdir($dir)) {
        if(is_file($rep.$f)) {
        $toplk[$f] = filectime($rep.$f);
        }
    }
    arsort($toplk);
    foreach($toplk as $fichier => $date) {
    print "\n       <li><a href=\"http://www.blind-guardian.fr/pics/news/" .$fichier ."\" target=\"_blank\">http://www.blind-guardian.fr/pics/news/" . $fichier ."</a> <em>(" . dd(filemtime($the_path.$fichier)) . ")</em></li>";
    }
    print "\n      </ul>\n      <br /><hr /><br />";
}
 
WRInaute discret
une deuxième version qui gère la récursion et qui devrait marcher en php4 :

Code:
<?php
/**
 * $dir should not contain '.' or '..'
 */
function dir_orderby_update_date($dir, $order=true){
  $dir_tempo = array();
  foreach($dir as $file){
    if($file != '.' && $file != '..'){
      $timestamp = filemtime($file);
      if(!$timestamp){
        $timestamp = 0;
      }
      $dir_tempo[$file] = $timestamp;
    }
  }
  if($order){
    asort($dir_tempo);
  }else{
    arsort($dir_tempo);
  } 
  return $dir_tempo;
}
function dir_list_stack_call($dir_path, $recursif = true){
  $list_path = array();
  $dir_cont = array();
  $list_path[] = $dir_path;
  $size = 1;
  for($i=0; $i<$size; $i++){ 
    if (($handle = opendir($list_path[$i])) != false) {
      while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != "..") {
          if(is_file($list_path[$i] . $file)){
            $dir_cont[] = $list_path[$i] . $file;
          }else if($recursif){
            $list_path[] = $list_path[$i] . $file . '/';
            $size++;
          }
        }
      }
      closedir($handle);
    }
  }
  return $dir_cont;
}
function dir_list_rec_call($dir_path, $recursif = true){
  $dir_cont = array();
  if (($handle = opendir($dir_path)) != false) {
    while (false !== ($file = readdir($handle))) {
      if ($file != "." && $file != "..") {
        if(is_file($dir_path.$file)){
          $dir_cont[] = $dir_path . $file;
        }else if($recursif){
          $dir_cont = array_merge($dir_cont, dir_list($dir_path . $file . '/'));
        }
      }
    }
    closedir($handle);
  }
  return $dir_cont;
}
/**
 * Wrapper used to select how we access recursive directories.
 * $dir_path needs to end with a forward slash '/'.
 **/
function dir_list($dir_path, $recursif = true){
  return dir_list_stack_call($dir_path, $recursif); // we use a stack
  //return dir_list_rec_call($dir_path, $recursif); // we use recursion
}


$dir_path = '/home/xxx/public_html/snippet/';
$dir_unsorted = dir_list($dir_path);

$dir_ordered = dir_orderby_update_date($dir_unsorted);
print_r($dir_ordered);
$dir_ordered_dec = dir_orderby_update_date($dir_unsorted, false);
print_r($dir_ordered_dec);
?>
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
Haut