Affichage des fichiers par date [Résolu]

Messages postés
86
Date d'inscription
vendredi 18 janvier 2008
Dernière intervention
19 juin 2009
- - Dernière réponse : ninho44
Messages postés
86
Date d'inscription
vendredi 18 janvier 2008
Dernière intervention
19 juin 2009
- 11 juin 2008 à 17:30
Bonjour tout le monde,
Je suis débutant en PHP, et je suis en train de créer un site. Mon problême: Je fais un systeme de news qui affiche sur ma page le contenu des fichiers stockés dans un dossier. Tout s'affiche correctement sauf que les fichiers s'affiche par ordre alphabétique, et moi je voudrais qu'il s'affiche en fonction de leur date de création, c'est a dire du plus récent au plus ancien...

voici mon bout de code:
function ParcourRepertoire($Chemin, $ProfondeurMax -1 , $Mode "TOUT", $P = 0)
{
   if(substr($Chemin, strlen($Chemin) - 1) != '/')
      $Chemin .= '/';
   $ListeRep = array();
   if($Mode != "FICHIERS")
      $ListeRep[] = $Chemin;
   if($handle = opendir($Chemin))
   {       while(false !($Fichier readdir($handle)))
       {
           if($Fichier != '.' && $Fichier != '..')
           {
               $Fichier = $Chemin . $Fichier;
               if(! is_dir($Fichier))
               {
                  if($Mode != "REPERTOIRES")
                     $ListeRep[] = $Fichier;
               }
               elseif($P >=0 && ($P < $ProfondeurMax || $ProfondeurMax < 0))
               {
                   $result = ParcourRepertoire($Fichier . '/', $ProfondeurMax, $Mode, $P + 1);
                   $ListeRep = array_merge($ListeRep, $result);
               }
           }
       }
       closedir($handle);
   }
   if($P == 0 )
      natcasesort($ListeRep);
   return($ListeRep);
}

/* DEBUT DU SCRIPT */

   $ListeResult = ParcourRepertoire('\dossier.');
   $TailleTab = count($ListeResult);
  
   for($i=0;$i<$TailleTab;$i++)
   {
      if(! is_dir($ListeResult[$i]))
      {
 
            /* Debut du script d'affichage du contenu du fichier */
            $fichier = file("$ListeResult[$i]"); // Nom du fichier à afficher
            $total = count($fichier); // Nombre total des lignes du fichier
       
                for($j = 0; $j < $total; $j++)
                    { // Départ de la boucle
                        echo ('                                 ----

                                '.$fichier[$j].',
                               
                               
'); // On affiche ligne par ligne le contenu du fichier
                    } // Fin de la boucle
                echo ('
----------------------------------------------------------------------------
');
            /* Fin du script d'affichage du contenu du fichier*/
      }
   }/* Fin de la boucle */

J'espere que j'ai été assez clair, et que mon code n'est pas trop brouillon.

Merci d'avance pour votre aide !!!
Afficher la suite 

Votre réponse

15 réponses

Meilleure réponse
Messages postés
1267
Date d'inscription
mercredi 7 juillet 2004
Dernière intervention
29 juin 2010
3
Merci
^^

Euh ... il n'y a pas de usort() dans mon code ... sinon, pour le code de malalam ... En fait, l'erreur provient du fait que $Dir n'est pas un array()

Sinon, c'est peut-être dû au fait que scandir renvoie FALSE en cas d'échec ...

if( ($aDir = scandir('.')) )
{
    usort((array) $aDir, 'sortByMtime');
}
else
{
    echo 'Erreur !';
}

<hr />Si ma reponse te convient, merci de l'accepter ! 

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 99 internautes ce mois-ci

Commenter la réponse de JoJo738
Messages postés
83
Date d'inscription
jeudi 22 septembre 2005
Dernière intervention
14 décembre 2011
0
Merci
Salut,

Peut-être une idée serait de créer un tableau dans lequel tu mets les noms de fichier et leur date,

Puis, tu demandes que ton tableau soit trié par date. ( attention au format de tes dates )
une fonction sort() ou array_multisort() devrait faire l'affaire.
http://fr.php.net/manual/fr/function.array-multisort.php

Enfin, tu parcours ton tableau pour reccupérer le noms de tes fichiers, que tu pourras alors traiter.

m100

NB :

Attention, il existe peut-être des solutions plus éfficaces au niveau du parcours d'un dossier ?
Commenter la réponse de MasterCent
Messages postés
75
Date d'inscription
samedi 23 juin 2007
Dernière intervention
3 février 2014
0
Merci
SALUT.
je pense une solution à ton probleme consiste à creer une table mysql pour stocker les noms des differents fichiers et leur date de creation.
puis pour l'affichage de faire une requete sur la table qui les affiche du plus recent au plus ancien.


http://www.bbsecurit.com
Tout mal qui ne nous tue pas nous rend plus fort.NIETSCHES
Commenter la réponse de Iriven
Messages postés
86
Date d'inscription
vendredi 18 janvier 2008
Dernière intervention
19 juin 2009
0
Merci
Euh non je ne peux pas le transfomer de façon a le mettre ds la base de données...mon supérieur ne veut pas :s  En revanche jai essayer avec sort() mais ca marche pas...peut etre je m'y prend mal...Ce serait possible de voir se que ca donnerait avec mon code ?
Commenter la réponse de ninho44
Messages postés
83
Date d'inscription
jeudi 22 septembre 2005
Dernière intervention
14 décembre 2011
0
Merci
Sur base de ton code ( l'interieur de la fonction ParcoursRepertoire , sans la récursivité),
je construit le tableau $result. sur base   $result[nom] => date ;
Ensuite, la fonction asort( $result ) à pour effet de trier le tableau sur base des valeurs.

Voilà.

<?PHP

    // lecture du nom des fichiers du dossiers
    $Chemin = "." ;
    $result =  Array() ;
    
    if($handle = opendir($Chemin))
    {       while(false !($Fichier readdir($handle)))
       {
           if($Fichier != '.' && $Fichier != '..')
           {
               /// $Fichier = $Chemin . $Fichier;
               if(! is_dir($Fichier))
               {
                  if($Mode != "REPERTOIRES")
                    /// $ListeRep[] = $Fichier;

                    // construction du tableau
                    $result [ $Fichier ] = filemtime ( $Fichier ) ;

                    
               }
               elseif($P >=0 && ($P < $ProfondeurMax || $ProfondeurMax < 0))
               {
                   /// $result = ParcourRepertoire($Fichier . '/', $ProfondeurMax, $Mode, $P + 1);
                   /// $ListeRep = array_merge($ListeRep, $result);
               }
           }
       }
       closedir($handle);
    }

    print_r ( $result ) ;
   
    // tri par valeurs
    asort ( $result ) ;

    print_r ( $result ) ;

?>
Commenter la réponse de MasterCent
Messages postés
86
Date d'inscription
vendredi 18 janvier 2008
Dernière intervention
19 juin 2009
0
Merci
Ok merci de ton coup de main...c'est un peu ce que j'avais fais!!
Mais la il me renvoi ce message d'erreur:
Warning: asort() expects parameter 1 to be array, null given

il n'aime pas asort je crois lol. Et il me dit aussi que filemtime n'est pas définit...je comprend plus rien !!!

C'est cool le PHP...mais seulement quand ça fonctionne !!!
Commenter la réponse de ninho44
Messages postés
83
Date d'inscription
jeudi 22 septembre 2005
Dernière intervention
14 décembre 2011
0
Merci
Pas de quoi pour le coup de main,

asort () :
- as tu testé l'argument donné à asort par un print_r ( ) ?  Afin d'être certain qu'il s'agit d'un tableau ?

filemtime () :
- as tu affiché la valeur de $Fichier (chemin compris ) // perso, j'ai eu un souci à ce niveau là, lors de l'utilisation de 



filemtime ()

...
Commenter la réponse de MasterCent
Messages postés
86
Date d'inscription
vendredi 18 janvier 2008
Dernière intervention
19 juin 2009
0
Merci
Bon ben la du coup je n'ai plus rien qui s'affiche...

Alors pour le filemtime c'est réglé...Par contre il a toujours du mal avec le asort()

J'ai fais comme tu m'a dit, donc j'ai fait print_r ($result); avant le asort(), et la le tableau ne s'affiche pas...pourtant le $result n'est pas vide....
Je comprend plus rien !!!
Commenter la réponse de ninho44
Messages postés
10918
Date d'inscription
lundi 24 février 2003
Dernière intervention
2 mars 2010
0
Merci
Hello,

il y a des paramètres que tu n'as pas dans le code proposé, tu ne rentres jamais dans le if().

Sinon :

<?php
function sortByMTime($a, $b) {
$aTime = filemtime($a);
$bTime = filemtime($b);
if($aTime === $bTime) {
return 0;
} elseif($aTime < $bTime) {
return 1;
} else {
return -1;
}
}

$aDir = scandir('.');
usort($aDir, 'sortByMtime');
print_r($aDir);
?>


A moduler selon le contexte (chemin différent, récursivité, etc). Mais tu as là un principe utilisable.
Commenter la réponse de malalam
Messages postés
86
Date d'inscription
vendredi 18 janvier 2008
Dernière intervention
19 juin 2009
0
Merci
Alors j'ai bien compris le principe, sauf que ca bug toujours au niveau du asort()...
Warning: usort(): The argument should be an array

Et il ne veut pas m'afficher ce fichu tableau...
Commenter la réponse de ninho44
Messages postés
1267
Date d'inscription
mercredi 7 juillet 2004
Dernière intervention
29 juin 2010
0
Merci
Hello

Voila une petite fonction que j'ai faite vite fait

<?php

if(!function_exists('scandir')) {

    // http://fr.php.net/scandir "Anders dot Jenbo at Pc dot DK"

    function scandir($dir, $sortorder = 0) {

        if(is_dir($dir) &amp;&amp; $dirlist = @opendir($dir)) {

            while(($file = readdir($dirlist)) !== false) {

                $files[] = $file;

            }

            closedir($dirlist);

            ($sortorder == 0) ? asort($files) : rsort($files); // arsort was replaced with rsort

            return $files;

        } else return false;

    }

}

function ExploreDirWithTime($dir, $asort = true, $recursive = true, $MultiArray = false)

{

    $return = array();

    if( !file_exists($dir) )

    {

    trigger_error('ExploreDirWithTime(' . $dir . ') : failed to open dir : Invalid directory', E_USER_WARNING);

        return false;

    }

    $files = scandir($dir);

    foreach( $files as $file )

    {

        if( in_array($file, array('.', '..')) )

        {

            continue;

        }

        $uri = $dir . DIRECTORY_SEPARATOR . $file;

        if( !is_dir($uri) )

        {

            if ( $recursive )

            {

                $return[$uri] = filemtime($uri);

            }

            else

            {

                $return[$file] = filemtime($uri);

            }

        }

        else if ( $recursive )

        {

            if( $MultiArray )

            {

                $return = array_merge($return, ExploreDirWithTime($uri, $asort, $recursive, $MultiArray));

            }

            else

            {

                $return[$file] = ExploreDirWithTime($uri, $asort, $recursive, $MultiArray);

            }

        }

    }

    asort($return);

    return $return;

}

$result = ExploreDirWithTime('.', true, true, true);

echo '';

print_r($result);

echo '

';

?>


Donc :
Fonction ExploreDirWithTime ($dir, [$asort = true, $recursive = true, $MultiArray = false])
$dir : le dossier
$asort : true/false appliquer ou non la fonction asort()
$recursive : true/false exploration des sous dossiers
$MultiArray : true/false > si true, array multidimentionnel, sinon, un seul array
<hr />Si ma reponse te convient, merci de l'accepter ! 
Commenter la réponse de JoJo738
Messages postés
86
Date d'inscription
vendredi 18 janvier 2008
Dernière intervention
19 juin 2009
0
Merci
Oui donc j'ai mis du temps à comprendre ton code (et oui je suis pas un pro... :s) et ça a l'air vraiment bien mais il me dit que la variable asort() n'est pas définit....
Mais quest-ce qu'il a mon tableau?? lol
Commenter la réponse de ninho44
Messages postés
1267
Date d'inscription
mercredi 7 juillet 2004
Dernière intervention
29 juin 2010
0
Merci
^^
Hum :s

quel est l'erreur exacte renvoyé par ton serveur ?

<hr />Si ma reponse te convient, merci de l'accepter ! 
Commenter la réponse de JoJo738
Messages postés
86
Date d'inscription
vendredi 18 janvier 2008
Dernière intervention
19 juin 2009
0
Merci
Voila le joli petit message d'erreur:

Warning: usort(): The argument should be an array
Commenter la réponse de ninho44
Messages postés
86
Date d'inscription
vendredi 18 janvier 2008
Dernière intervention
19 juin 2009
0
Merci
Ah voila !! :D  Niquel ca marche

Merci beaucoup ...
Commenter la réponse de ninho44

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.