Transmettre un tableau dans une fonction

Quand on souhaite qu'une fonction ne retourne pas qu'un seul résultat, on peut utiliser les tableaux, y compris multi-dimensionnels (cf. fr.php.net/array). J'en profite pour utiliser la fonction de formatage des unités de taille de fichiers, d'un sympathique contributeur de www.php.net (je ne retrouve plus le topic !)

Scan d'un répertoire

# fonction de formatage des unités de taille d'un fichier
# source : contributeur de http://www.php.net/
function do_bytes($size) {
   $ko = 1024;        // Kilo octets
   $mo = 1024 * $ko;  // Mega octets
   $go = 1024 * $mo;  // Giga octets
   $to = 1024 * $go;  // Tera octets
   if($size == 0) return "n/a";
   if($size < $ko) return $size." octets";
   if($size < $mo) return sprintf("%01.1f", $size/$ko,2)." Ko";
   if($size < $go) return sprintf("%01.1f", $size/$mo,2)." Mo";
   if($size < $to) return sprintf("%01.1f", $size/$go,2)." Go";
   return sprintf("%01.1f", $size/$to,2)." To";
}

# fonction de scan de $repertoire
function scanFichiers($repertoire){
   # ouverture du répertoire
   $handle = @opendir($repertoire);
   # lecture des fichiers
   while ($fichier = @readdir($handle)) {
      if ($fichier == "." || $fichier == "..") continue;
      if (is_dir($repertoire.$fichier)) continue;
      # on pourrait limiter le scan à un ou plusieurs types de fichiers
      # if (!preg_match("/\.php|\.htm/i", $fichier)) continue;
      $q_fichier++;
      $t_fichier += filesize($repertoire.$fichier);
      $n_fichier[] = $fichier; # nom des fichiers dans un tableau
   }
   # fermeture du répertoire et tri des noms de fichiers
   @closedir($handle);
   @sort($n_fichier);
   # implémentation de $tableau avec trois items
   $tableau['taille'] = $t_fichier; # taille totale des fichiers
   $tableau['nombre'] = $q_fichier; # nombre de fichiers
   $tableau['noms'] = $n_fichier; # noms des fichiers
   return $tableau;
}

# exécution : transmission du répertoire à scanner dans l'URL
if(!$repertoire = $_GET['repertoire'])
   $repertoire = "./"; # sinon répertoire courant par défaut
$tableau = scanFichiers($repertoire);
# affichage de la taille totale avec conversion
echo "Taille totale : ".do_bytes($tableau['taille']);
echo "<br>Nombre de fichiers : ".$tableau['nombre'];
echo "<br>Noms : ";
# lecture du tableau 'noms'
foreach($tableau['noms'] as $val)
   echo "<br>$val";

Attention : foreach fr2.php.net/foreach n'accepte pas de valeur vide. On peut alors utiliser la structure classique for fr2.php.net/for

for($i=0; $i<count($tableau['noms']); $i++)
   echo "<br>".$tableau['noms'][$i];

Une alternative, partant du principe qu'au moins un item du tableau sera implémenté, est de lire le tableau en deux boucles.

foreach($tableau as $key => $val) {
   echo "$key :";
   # $val n'est pas un tableau
   if(!is_array($val)) {
      echo " $val<br>";
   # sinon lecture du tableau $val
   } else {
      foreach($val as $value)
         echo "<br>$value";
   }
}

http://dev.ppan.net [Haut de page] [Document mis à jour le 11.06.2010]