Page 1 sur 1

fonctions de répertoire...

Posté : 30 nov. 2006, 01:14
par jojolapine
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:

Posté : 30 nov. 2006, 01:30
par DocType

Posté : 30 nov. 2006, 01:44
par jojolapine
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?

Posté : 30 nov. 2006, 02:08
par DocType
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:

Posté : 30 nov. 2006, 02:09
par jojolapine
bon ok je met résolu, et pis j eviendrai mettre mes résultats quand-même :wink:
merci