fonctions de répertoire...

ViPHP
ViPHP | 3607 Messages

30 nov. 2006, 01:14

Bonsoir à tous,
J'ai besoin sur un de mes sites, d'afficher une image aléatoirement,
et voici la structure de la partie de stockage des images:

Code : Tout sélectionner

+photos/ +utilisateur1/ +maxi/ +mini/ +utilisateur2/ +maxi/ +mini/ +utilisateur3/ +maxi/ +mini/ etc
donc voilà ce que je souhaite faire, tout d'abord choisir au hasard un utilisateur, ensuite aller dans maxi, et là choisir aléatoirement une photo
pour ce faire, j'ai fait cette fonction:
function random_image(){
    //Répertoire de départ.
    $rep_photos='./photos/';
    $dir= dir($rep_photos);

    // on récupères les différents utilisateurs (leur dossiers)
    $dirs1=array();
    while (false !== ($entry = $dir->read())) {
        array_push($dirs1,$entry);
    }

    //on enlève le . et le ..
    unset($dirs1[0]);
    unset($dirs1[1]);

    //on élimine d'éventuelles erreurs sur le tableau, et on le réindexe
    $dirs1=array_filter($dirs1);
    $dirs1=array_values($dirs1);

    //on choisi au hasard un index qui donne un répertoire au hasard
    $index=rand(0,count($dirs1)-1);
    $rep_util=$dirs1[$index];

    //on libère les ressources
    $dir->close();

    //on se place dans le répertoire choisi, puis dans le répertoire maxi de ce dernier
    $dir2= dir($rep_photos.$rep_util.'/maxi/');
    $dirs2=array();

    //récupération des photos
    while (false !== ($entry = $dir2->read())) {
        array_push($dirs2,$entry);
    }

    // petite fontion qui élimine du tableau les fichiers autre qu'image, comme thumb par exemple
    $dirs2=tri_photos_dir($dirs2);

    // libération des ressources
    $dir2->close();

    //on retourne au hasard une des photos du dernier tableau, associé au chemin complet trouvé plus haut
    return $rep_photos.$rep_util.'/maxi/'.$dirs2[''.rand(0,count($dirs2)-1).''];
}
ma question est, comment faire pour savoir si un répertoire et vide, et à ce moment la, l'enlever du tableau des répertoires utilisateur, (ou ne pas le mettre au départ)
Ensuite, si vous avez des améliorations au niveau de la rapidité du code :wink:

Mammouth du PHP | 1776 Messages

30 nov. 2006, 01:30


ViPHP
ViPHP | 3607 Messages

30 nov. 2006, 01:44

merci!
voici comment j'ai fait
while (false !== ($entry = $dir->read())) {
      //si on a pas le . ou le ..,  et si le répertoire maxi de ce répertoire n'est pas vide (hormis . et ..) alors on ajoute
      if(!preg_match('#^\.{1,2}$#',$entry) && (count(scandir($rep_photos.$entry.'/maxi/'))>2)){
        array_push($dirs1,$entry);
      }
    }
par contre maintenant que je connais scandir, je me demande si ça ne serai pas plus rapide de récupérer les contenus avec scandir, et de faire un array_map après... ? :-k
que feriez vous à ma place?

Mammouth du PHP | 1776 Messages

30 nov. 2006, 02:08

A ta place, je ferais des calculs de vitesse d'éxecution :wink:
tu fais le listing en boucle pendant 100 fois sur chacune des solutions, et tu fais afficher le temps d'éxecution du script :wink:

ViPHP
ViPHP | 3607 Messages

30 nov. 2006, 02:09

bon ok je met résolu, et pis j eviendrai mettre mes résultats quand-même :wink:
merci