Affichage des fichiers par date [Résolu]

Signaler
Messages postés
86
Date d'inscription
vendredi 18 janvier 2008
Statut
Membre
Dernière intervention
19 juin 2009
-
ninho44
Messages postés
86
Date d'inscription
vendredi 18 janvier 2008
Statut
Membre
Dernière intervention
19 juin 2009
-
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 !!!
A voir également:

15 réponses

Messages postés
1267
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
29 juin 2010
1
^^

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 ! 
Messages postés
83
Date d'inscription
jeudi 22 septembre 2005
Statut
Membre
Dernière intervention
14 décembre 2011
1
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 ?
Messages postés
74
Date d'inscription
samedi 23 juin 2007
Statut
Membre
Dernière intervention
3 février 2014

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
Messages postés
86
Date d'inscription
vendredi 18 janvier 2008
Statut
Membre
Dernière intervention
19 juin 2009

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 ?
Messages postés
83
Date d'inscription
jeudi 22 septembre 2005
Statut
Membre
Dernière intervention
14 décembre 2011
1
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 ) ;

?>
Messages postés
86
Date d'inscription
vendredi 18 janvier 2008
Statut
Membre
Dernière intervention
19 juin 2009

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 !!!
Messages postés
83
Date d'inscription
jeudi 22 septembre 2005
Statut
Membre
Dernière intervention
14 décembre 2011
1
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 ()

...
Messages postés
86
Date d'inscription
vendredi 18 janvier 2008
Statut
Membre
Dernière intervention
19 juin 2009

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 !!!
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
20
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.
Messages postés
86
Date d'inscription
vendredi 18 janvier 2008
Statut
Membre
Dernière intervention
19 juin 2009

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...
Messages postés
1267
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
29 juin 2010
1
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 ! 
Messages postés
86
Date d'inscription
vendredi 18 janvier 2008
Statut
Membre
Dernière intervention
19 juin 2009

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
Messages postés
1267
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
29 juin 2010
1
^^
Hum :s

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

<hr />Si ma reponse te convient, merci de l'accepter ! 
Messages postés
86
Date d'inscription
vendredi 18 janvier 2008
Statut
Membre
Dernière intervention
19 juin 2009

Voila le joli petit message d'erreur:

Warning: usort(): The argument should be an array
Messages postés
86
Date d'inscription
vendredi 18 janvier 2008
Statut
Membre
Dernière intervention
19 juin 2009

Ah voila !! :D  Niquel ca marche

Merci beaucoup ...