Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1603 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Listage de fichiers avec array

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Listage de fichiers avec array

n°836711
Surfoo
Ça va ? ok.
Posté le 30-08-2004 à 15:39:14  profilanswer
 

Voilà je veux lister des fichiers logs de mon site (sous la forme : log29-08-04.txt, et il y en a un par jour), par ordre de date et en utilisant les tableaux.
Pour l'instant je n'ai pas fait le tri par date de fichier mais si vous pouviez me dire comment faire car je ne vois pas trop comment faire...
En plus du listage, je récupère la taille du fichier et le nombre de ligne du fichier (ça fonctionne ça).
 
J'ai voulu faire ça en utilisant les tableaux mais j'ai un peu de mal là. J'espere que je suis bien parti déjà... Le problème est dans la fonction... :/
 
Voilà le code :  

Code :
  1. <?php
  2. //listage des fichiers logs dans un tableau
  3. if (is_dir($dir)) {
  4.    if ($dh=@opendir($dir)) {
  5.       $i=0;
  6.       while (($file=@readdir($dh)) != false) {
  7.          if ($file!="." && $file!=".." && $file!="htaccess" ) {
  8.             //variables du fichier
  9.             $chemin=$dir.$file;
  10.             $date=substr($file, 3,-4);
  11.             $taille=round(filesize($chemin)/1024, 1);
  12.             $nbligne=count(file($chemin));
  13.             $log=array('fichier'=>$file, 'date'=>$date, 'poids'=>$taille, 'nbligne'=>$nbligne);
  14.          }
  15.       $i++;
  16.       }
  17.    }
  18.    closedir($dh);
  19. }
  20. else {
  21.          echo "Pas de fichiers !";
  22. }
  23. /* Fonction */
  24. function afficher_tableau($tableau) {
  25.             foreach ($tableaux as $tab) {
  26.                if(is_array($tab)) {
  27.                  foreach ($tab as $valeur) {
  28.                  if ($valeur['nbligne'] > 1)
  29.                    $valeur['nbligne'] = $valeur['nbligne']." lignes";
  30.                  else
  31.                    $valeur['nbligne'] = $valeur['nbligne']." ligne";
  32.                
  33.                  echo "<tr class=\"ligne\">
  34.                       <td class=\"logfichier\"><a href=\"logs_details.php?log=".$valeur['fichier']."\">".$valeur['date']."</a></td>
  35.                       <td class=\"logtaille\">".$valeur['poids']." Ko</td>\n <td class=\"lognblignes\">".$valeur['nbligne']."</td>
  36.                       <td class=\"editdel\"><a href=\"logslist.php?del=".$valeur['fichier']."\" title=\"Effacer ".$valeur['fichier']."\" onclick=\"return confirm('Supprimer le log du ".$valeur['date']." ?'); \"><img src=\"./img/del.png\" width=\"11\" height=\"13\" alt=\"Supprimer le log\" title=\"Supprimer le log\" /></a></td>
  37.                      </tr>\n";
  38.                  $sumtaille += $taille;
  39.                  $sumligne += $nbligne;
  40.               }
  41.             }
  42.          }
  43. }
  44. /* FIN Fonction */
  45. if (isset($log)) {
  46.          $i=$i-3;
  47.          echo "
  48.          <p>Il y a ".$i." fichiers logs.</p>
  49.          <table id=\"tableaulogs\">
  50.             <tr class=\"tableaulogs\">
  51.             <td>Date</td>
  52.             <td>Poids</td>
  53.             <td>Nombre de lignes</td>
  54.             <td><img src=\"./img/del.png\" width=\"11\" height=\"13\" alt=\"Supprimer les logs\" title=\"Supprimer les logs\" /></td>
  55.             </tr>\n";
  56.             $sumtaille=0;
  57.             $sumligne=0;
  58.       afficher_tableau($log);
  59.       echo "<tr class=\"tableaulogs\">\n <td>&nbsp;</td>\n <td>$sumtaille Ko</td>\n <td>$sumligne lignes</td>\n <td>&nbsp;</td>\n</tr>\n</table>\n";
  60. }
  61. ?>


 
J'ai fait un  

Code :
  1. echo "<pre>";
  2. print_r($log);
  3. echo "</pre>";


et les données du tableau s'affichent bien.
 
Si vous pouviez me dire en plus pour le tri par date de fichier :)
 
Merci beaucoup.
 
Edit: Si vous voyez des trucs que je pourrais optimiser, n'hésitez pas aussi .

mood
Publicité
Posté le 30-08-2004 à 15:39:14  profilanswer
 

n°836758
Sebastien
Posté le 30-08-2004 à 16:06:30  profilanswer
 

SI j'ai bien compris la question c'est la fonction usort qu'il te faut.

n°836761
Surfoo
Ça va ? ok.
Posté le 30-08-2004 à 16:08:07  profilanswer
 

Oui mais ça c'est en plus, je me suis pas penché dessus encore.
 
Le problème déjà c'est que je n'arrive pas à faire afficher les données de l'array dans les cellules du tableau...
 
Merci :)

n°836783
Sebastien
Posté le 30-08-2004 à 16:19:52  profilanswer
 

Ben deja tu as plusieurs erreurs dans ton code
 
Ligne 13 : tu ecrases à chaque fois ton fichier $log.
Mme toute ta fonction va te peter à la gueule s'il y a un repertoire dans ce dossier
 
Ligne 25 : c'est $tableau et pas $tableaux

n°836802
Surfoo
Ça va ? ok.
Posté le 30-08-2004 à 16:29:48  profilanswer
 

Merci pour l'erreur en ligne 25.
 
Pour la ligne 13, tu proposes quoi ? Je comprend pas trop là
 
quand je j'affiche les données avec print_r j'obtiens :
 
Array
(
    [fichier] => log01-08-2004.txt
    [date] => 01-08-2004
    [poids] => 0.1
    [nbligne] => 1
)
 
Array
(
    [fichier] => log02-08-2004.txt
    [date] => 02-08-2004
    [poids] => 0.1
    [nbligne] => 1
)
 
Array
(
    [fichier] => log03-08-2004.txt
    [date] => 03-08-2004
    [poids] => 37
    [nbligne] => 255
)
 
etc...
 
Ce n'est pas ça qu'il me faut pour mettre dans mes cellules ensuite ?

n°836806
Sebastien
Posté le 30-08-2004 à 16:33:51  profilanswer
 

Oula pas normal que ca t'affiche ca :p (a moins que ton print_r tu l as fait juste en dessous du $log = ...)
Autre petit truc ton $i++; tu le passes avant l'accolade fermante ca t'evitera de faire ton $i = $i - 3;
 
en gros faut que tu fasses une sorte de $log[$i] =

n°836808
Sebastien
Posté le 30-08-2004 à 16:39:36  profilanswer
 

rempalce aussi tes lignes 25 26 27 par  
while (list($key, $valeur) = each($tableaux)) {
supprime 40 et 41
Ca devrait marcher avec mon $log[$i] du dessus.
Mais y a pleins de trucs à revoir pour que ca soit parfait.

n°836814
Sebastien
Posté le 30-08-2004 à 16:46:53  profilanswer
 

Et voici le morceau de code qui va bien pour ton tri par date.
 

Code :
  1. function compare($a, $b){
  2.     return strcmp($a['date'], $b['date']);
  3. }
  4. usort($log, "compare" );


Message édité par Sebastien le 30-08-2004 à 16:49:55
n°836817
Surfoo
Ça va ? ok.
Posté le 30-08-2004 à 16:48:15  profilanswer
 

Merci pour le $i, je n'y avais pas pensé :D
 
pour le print_r, j'ai ça  
 

Code :
  1. //listage des fichiers logs dans un tableau
  2. if (is_dir($dir)) {
  3. if ($dh=@opendir($dir)) {
  4.  $i=0;
  5.  while (($file=@readdir($dh)) != false) {
  6.   if ($file!="." && $file!=".." && $file!="htaccess" ) {
  7.    //variables du fichier
  8.    $chemin=$dir.$file;
  9.    $date=substr($file, 3,-4);
  10.    $taille=round(filesize($chemin)/1024, 1);
  11.    $nbligne=count(file($chemin));
  12.    /*$log[]=array(fichier=>$file, date=>$date, poids=>$taille, nbligne=>$nbligne);*/
  13.    $log=array('fichier'=>$file, 'date'=>$date, 'poids'=>$taille, 'nbligne'=>$nbligne);
  14.    $i++;
  15.   }
  16.  echo "<pre>";
  17. print_r($log);
  18. echo "</pre>";
  19.  }
  20. }
  21. closedir($dh);
  22. }


 
Donc il faudrait que je remplace :
 
$log=array('fichier'=>$file, 'date'=>$date, 'poids'=>$taille, 'nbligne'=>$nbligne);  
par :
$log[]=array('fichier'=>$file, 'date'=>$date, 'poids'=>$taille, 'nbligne'=>$nbligne);  
 
et j'obtiens ça :
 
Array
(
    [0] => Array
        (
            [fichier] => log01-08-2004.txt
            [date] => 01-08-2004
            [poids] => 0.1
            [nbligne] => 1
        )
 
)
 
Array
(
    [0] => Array
        (
            [fichier] => log01-08-2004.txt
            [date] => 01-08-2004
            [poids] => 0.1
            [nbligne] => 1
        )
 
    [1] => Array
        (
            [fichier] => log02-08-2004.txt
            [date] => 02-08-2004
            [poids] => 0.1
            [nbligne] => 1
        )
 
)
 
Array
(
    [0] => Array
        (
            [fichier] => log01-08-2004.txt
            [date] => 01-08-2004
            [poids] => 0.1
            [nbligne] => 1
        )
 
C'est normal ? :heink:  :heink:  :heink:
 
si je remplace : print_r($log);
par : print_r($log[$i]);
 
je n'obtiens plus la liste mais j'ai des cle qui sont dans le tableau maintenant et c'est un peu n'importe quoi ce que j'obtiens :
 
http://surfoo3.free.fr/images/array.jpg
 
Je sens que je suis proche de ce que je veux, mais j'y arrive pas  :(

n°836819
Sebastien
Posté le 30-08-2004 à 16:51:50  profilanswer
 

Tout le code qui marche.
 
Mais fait attention j'ai change ton truc pour les dates ^^
 

Code :
  1. <?php
  2. //listage des fichiers logs dans un tableau
  3. $dir = './bak/';
  4. $log = array();
  5. if (is_dir($dir)) {
  6.     if ($dh = @opendir($dir)) {
  7.         $i = 0;
  8.         while (($file = @readdir($dh)) != false) {
  9.             if ($file != "." && $file != ".." && $file != "htaccess" ) {
  10.                 //variables du fichier
  11.                 $chemin  = $dir.$file;
  12.                 $date    = date ("Ymd", filemtime($chemin));
  13.                 $taille  = round(filesize($chemin)/1024, 1);
  14.                 $nbligne = count(file($chemin));             
  15.                 $log[$i] = array('fichier'=>$file, 'date'=>$date, 'poids'=>$taille, 'nbligne'=>$nbligne);
  16.                 $i++;
  17.             }
  18.         }
  19.     }
  20.     closedir($dh);
  21. }
  22. else {
  23.     echo "Pas de fichiers !";
  24. }
  25. //print_r($log);
  26. /* Fonction */
  27. function afficher_tableau($tableaux) {
  28.     while (list($key, $valeur) = each($tableaux)) {
  29.         if ($valeur['nbligne'] > 1)
  30.         $valeur['nbligne'] = $valeur['nbligne']." lignes";
  31.         else
  32.         $valeur['nbligne'] = $valeur['nbligne']." ligne";
  33.         echo "<tr class=\"ligne\">
  34.         <td class=\"logfichier\"><a href=\"logs_details.php?log=".$valeur['fichier']."\">".$valeur['date']."</a></td>
  35.         <td class=\"logtaille\">".$valeur['poids']." Ko</td>\n <td class=\"lognblignes\">".$valeur['nbligne']."</td>
  36.         <td class=\"editdel\"><a href=\"logslist.php?del=".$valeur['fichier']."\" title=\"Effacer ".$valeur['fichier']."\" onclick=\"return confirm('Supprimer le log du ".$valeur['date']." ?'); \"><img src=\"./img/del.png\" width=\"11\" height=\"13\" alt=\"Supprimer le log\" title=\"Supprimer le log\" /></a></td>
  37.         </tr>\n";
  38.         $sumtaille += $taille;
  39.         $sumligne  += $nbligne;
  40.     }
  41. }
  42. function compare($a, $b)
  43. {
  44.     return strcmp($a['date'], $b['date']);
  45. }
  46. /* FIN Fonction */
  47. if (isset($log)) {   
  48.     echo "
  49.     <p>Il y a ".$i." fichiers logs.</p>
  50.     <table id=\"tableaulogs\">
  51.     <tr class=\"tableaulogs\">
  52.     <td>Date</td>
  53.     <td>Poids</td>
  54.     <td>Nombre de lignes</td>
  55.     <td><img src=\"./img/del.png\" width=\"11\" height=\"13\" alt=\"Supprimer les logs\" title=\"Supprimer les logs\" /></td>
  56.     </tr>\n";
  57.     $sumtaille = 0;
  58.     $sumligne  = 0;
  59.     usort($log, "compare" );
  60.     reset($log);
  61.     afficher_tableau($log);
  62.     echo "<tr class=\"tableaulogs\">\n <td>&nbsp;</td>\n <td>$sumtaille Ko</td>\n <td>$sumligne lignes</td>\n <td>&nbsp;</td>\n</tr>\n</table>\n";
  63. }
  64. ?>


Message édité par Sebastien le 30-08-2004 à 17:01:08
mood
Publicité
Posté le 30-08-2004 à 16:51:50  profilanswer
 

n°836828
Surfoo
Ça va ? ok.
Posté le 30-08-2004 à 16:57:13  profilanswer
 

Je vais regarder ce que tu as fait :)
 
Merci bien  :jap:

n°836936
Surfoo
Ça va ? ok.
Posté le 30-08-2004 à 18:20:14  profilanswer
 

C'est possible d'avoir un echo et de retourner un tableau dans la même fonction ?
Car je ne peux pas récupérer les variables $sumtaille et $sumligne.
Donc j'ai fait ça à la place des 2 lignes :
 

Code :
  1. $total[0] += $valeur['poids'];
  2. $total[1] += $valeur['nbligne'];


 
et ensuite j'ai testé en mettant ça dans la fonction :
 

Code :
  1. while(list($key,$val)=each($total)){
  2. echo $val;
  3. echo "\n";
  4. }


 
Et ça fonctionne mais si je met ça en dehors de la fonction ça ne fonctionne pas, d'ou ma question..
 
Merci :)


Message édité par Surfoo le 30-08-2004 à 18:27:20
n°837412
Sebastien
Posté le 31-08-2004 à 09:52:39  profilanswer
 

Oui c'est possible, sauf que bon normalement les fonctions sont pas trop la pour faire des echo, enfin c'est pas bien grave ca.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Listage de fichiers avec array

 

Sujets relatifs
Fichiers FIC ert NDXTableau Array [JS]
Comment récupere la valeur d'un array avec les globales ?mise en ligne de fichiers volumineux à télécharger
liste des fichiers dans un répertoire[RegExp] changer le nom du répertoire source dans des fichiers html
Limitations des fichiers INI[JAVA] Lister les fichiers d'un répertoire d'un JAR
Petite question à propos de l'accès en mode binaire des fichiers...Perl :: probleme d'array et de length [resolu]
Plus de sujets relatifs à : Listage de fichiers avec array


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR