Listage de fichiers avec array

Listage de fichiers avec array - PHP - Programmation

Marsh Posté le 30-08-2004 à 15:39:14    

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 .

Reply

Marsh Posté le 30-08-2004 à 15:39:14   

Reply

Marsh Posté le 30-08-2004 à 16:06:30    

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

Reply

Marsh Posté le 30-08-2004 à 16:08:07    

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 :)

Reply

Marsh Posté le 30-08-2004 à 16:19:52    

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

Reply

Marsh Posté le 30-08-2004 à 16:29:48    

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 ?

Reply

Marsh Posté le 30-08-2004 à 16:33:51    

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] =

Reply

Marsh Posté le 30-08-2004 à 16:39:36    

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.

Reply

Marsh Posté le 30-08-2004 à 16:46:53    

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
Reply

Marsh Posté le 30-08-2004 à 16:48:15    

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  :(

Reply

Marsh Posté le 30-08-2004 à 16:51:50    

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
Reply

Marsh Posté le 30-08-2004 à 16:51:50   

Reply

Marsh Posté le 30-08-2004 à 16:57:13    

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

Reply

Marsh Posté le 30-08-2004 à 18:20:14    

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
Reply

Marsh Posté le 31-08-2004 à 09:52:39    

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.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed