8797 sujets

Développement web côté serveur, CMS

Bien le bonjour,

J'ai un petit soucis pour un projet.
Je vais tenter d'expliquer mon cas Smiley smile

Donc en gros, j'ai déjà créer toute la partie pour uploader des images dans différents dossiers et mon objectif serait de récupérer toutes les images des dossiers (déjà fait le code va suivre) mais d'en sélectionner 3 mais aléatoirement (pour le moment je récupère les 3 premiers dans l'ordre alphabétique).

Note: désolé pour l'indentation de mon code, c'est du copier/coller

<div class="bloc_right">
      <h1>Images aléatoires</h1>
      <div id="slider">
<?
					function preg_ls ($path=".", $rec=false, $pat="/.*/") {
						$pat=preg_replace ("|(/.*/[^S]*)|s", "\\1S", $pat);
						while (substr ($path,-1,1) =="/") $path=substr ($path,0,-1);
						if (!is_dir ($path) ) $path=dirname ($path);
						if ($rec!==true) $rec=false;
						$d=dir ($path);
						$ret=Array ();
						while (false!== ($e=$d->read () ) ) {
							if ( ($e==".") || ($e=="..") ) continue;
							if ($rec && is_dir ($path."/".$e) ) {
								$ret=array_merge ($ret,preg_ls($path."/".$e,$rec,$pat));
								continue;
							}
							if (!preg_match ($pat,$e) ) continue;
							$ret[]=$path."/".$e;
						}
						return (empty ($ret) && preg_match ($pat,basename($path))) ? Array ($path."/") : $ret;
					}
					foreach ( preg_ls ("gallery", true, "/thumb/") as $file ) {
						if ($cpt<3) {
							$img_file = strstr($file, 'thumb_');
							$img_file = substr($img_file, 6);
							$needle = 'thumb_';
							$l_path = substr($file, 0, strpos($file, $needle));
							$img_file = $l_path . $img_file;
?> 							
							<table border='0' cellspacing='0' cellpadding='0' align='center' style="float:left; width:150px; height:150px;"><tr><td valign="middle">
								<a rel="random_img" class="open_fancy" href="<? echo $img_file; ?>"><img src="<? echo $file; ?>" /></a>
							</td></tr></table>
<?  
							$cpt += 1;
						}
						else {
							break;
						}
					}
?>
        </div>
</div>


Petite explication du code :
- je vais dans le dossier gallery (qui contient plusieurs dossiers contenant des images [ex: test.jpg] et leur thumbail [ex: thumb_test.jpg] )
- je récupère toutes les images qui commencent par 'thumb_'
- à partir de la variable qui contient le chemin et le nom d'image (thumb), je fais en sorte de retirer les caractère 'thumb_' et donc d'avoir l'adresse de son image originale.
- enfin je fais une boucle pour afficher le tout (note j'ai utilisé un tableau pour tester)


Rappel de ce que je voudrais en plus :
- lorsque je récupère toutes adresses d'images, je voudrais en sélectionnez 3 aléatoirement.
- ou alors une solution alternative qui consomme moins de performance parce que là, j'ai fait à l'arrache mais j'ai pas d'autres solutions


Merci d'avance et bonne journée
Modifié par stunty (20 Apr 2009 - 11:17)
Modérateur
Salut Stunty et bienvenue sur le forum,

Là, je n'ai pas trop le temps de parcourir ton code. Par contre, je viens de voir quelque chose qui me choque et qui pourrait te causer de multiples désagréments. Je te propose de lire ce tuto afin de cerner ton erreur.

En outre, j'ai l'impression également que tu n'as pas fait les vérifications d'usages et que ton code me parait un peu long.

<<<EDIT
À vue de nez, je ferai cette méthodologie (peut être que je me trompe) :

1. verif d'usage de sécurité (poids fichier, format, etc.)
2. scanne du dossiers images en questions dans un array()
3. utilisation de la fonction mt_rand() (plus performantes que rand()) Smiley cligne
4. affichage des images aléatoirement
EDIT;

Bonne soirée à toi et au plaisir de te lire.
Modifié par Nolem (18 Apr 2009 - 20:29)
Hello,

Merci de l'intérêt que tu me portes si rapidement même si c'est remis pour un peu plus tard (mais pas trop j'espère Smiley cligne .

Sinon pour les balises <? ?>, je suis tout à fait au courant mais c'est pour des phases de tests encore, pour l'adaptation finale, no soucis.
Note: j'ai déjà pas mal galérer pour pondre cela même si ce n'est sûrement pas propre du tout.

C'est pour cela que je demande un coup de main, merci bien.
Modérateur
re,

À moins que notre ami Heyoan passe par là entre temps, j'essaierai de regarder ce soir chez moi ton code (erf, je suis dans le jus de fruit) et je te posterai demain ma réponse (pas internet à la maison).
Salut,

comme je passais par là... Smiley lol

@stunty > bienvenue sur le forum,

j'aurais fais quelque chose comme ça :
...
$nb_a_trouver = 3;
$trouvees = array();
$images = preg_ls ("gallery", true, "/thumb/");
while(count($trouvees) < $nb_a_trouver) {
	$rand = mt_rand(0, count($images)-1);
	if(!in_array($rand, $trouvees)) {
		$trouvees[] = $rand;
	}
}
foreach ($trouvees as $key ) {
	$file = $images[$key];
	$img_file = strstr($file, 'thumb_');
	$img_file = substr($img_file, 6);
	$needle = 'thumb_';
	$l_path = substr($file, 0, strpos($file, $needle));
	$img_file = $l_path . $img_file;
?> 							
<p><a rel="random_img" class="open_fancy" href="<?php echo $img_file; ?>"><img src="<?php echo $file; ?>" /></a></p>
<?php
}
?>
Modérateur
Salut,

@Heyoan => Arf, les grands esprits se rencontrent Smiley lol . Je vais lire attentivement ton code Smiley smile

@bzh => En effet, je ne m'en souvenais plus. Toutefois, il me semble que mt_rand() est plus rapide.

@Stunty => De mon côté, j'ai préféré repartir de zéro Smiley murf . Ton code m'a déconcerté avec les continue, les break et peu lisible (6h du mat, c'est chaud de coder encore). Voici cette petite ébauche. Tu n'as plus qu'à le mettre dans les balises img. Smiley smile . J'espère que cela te convient :


<?php
function lectureRepertoire($chemin){    
    $repertoire = dir($chemin);
    while($lecture = $repertoire->read()){
        $carte[] = $lecture;
    }
    $repertoire->close();
    array_shift($carte);
    array_shift($carte);
    return $carte;    
}

//indiquer chemin du répertoire
$repertoire_a_scanner = "gallery";

$nb_image_aleatoire = 5;
$carte_repertoire = array();
$chemin = "";
$carte_image = array();
$pattern = "#^thumb_#";
$selection_thumb = array();
$images_selectionnes = array();


$carte_repertoire = lectureRepertoire($repertoire_a_scanner);

for($i=0;$i<count($carte_repertoire);$i++){
    $chemin = $repertoire_a_scanner."/".$carte_repertoire[$i];
    $carte_image[$chemin] = lectureRepertoire($repertoire_a_scanner."/".$carte_repertoire[$i]);
}

foreach($carte_image as $k =>$v){
    for($i=0;$i<count($v);$i++){
        if(preg_match($pattern,$v[$i])){
            $selection_thumb[] = $k."/".$v[$i];
        }
    }
}

for($i=0;$i<$nb_image_aleatoire;$i++){
    $aleatoire = mt_rand(0,count($selection_thumb)-1);
    $images_selectionnes[] = $selection_thumb[$aleatoire];
}

print_r($images_selectionnes);
?>


++
Modifié par Nolem (19 Apr 2009 - 20:31)
bzh a écrit :
il y a une fonction php pour prendre des valeurs au hazard dans un tableau : array_rand.
Ah tiens ! Je connaissais pas ! Thanks. Smiley cligne
Bien le bonjour en ce début de semaine Smiley smile

Je vous remercie grandement pour cette phase d'optimisation.
J'ai testé un peu toutes vos propositions et au final j'ai préféré utiliser la méthode de Heyoan.

Bon ben voilà voilà mon dernier problème php a été réglé Smiley biggrin

Encore merci et peut-être à la prochaine.
Bon boulot et profitons du soleil.
stunty a écrit :
j'ai préféré utiliser la méthode de Heyoan.
Ben elle est toujours valable mais comme le faisait remarquer bzh il est inutile de faire la boucle pour trouver les 3 images aléatoires : tu peux utiliser array_rand.

Et si tu considères que ce sujet est [Résolu] merci de l'indiquer en éditant ton premier post et en modifiant le titre. Smiley cligne