Affichage image aléatoire à partir d'un dossier

ViPHP
AB
ViPHP | 5818 Messages

15 sept. 2012, 03:35

Oulà il a la vie dure ce topic, ouvert depuis 2005 !

Sinon pour ceux qui veulent optimiser le code du premier message, on a tout intérêt à utiliser la fonction glob de php. Avec glob pas besoin de "opendir", ni autre "readdir" et "closedir". En plus glob possède un système de masque qui remplacera avantageusement le preg_match. Par ailleurs le résultat retourné est directement un tableau il suffira donc de faire simplement un array_rand

soit si l'on veut sélectionner au hasard une image de type jpg, jpeg, gif ou png dans le répertoire 'PHOTO' :
$dossier = 'PHOTO';
$dossier_images = $dossier.'/*.{jpg,jpeg,gif,png}';
$tab_dossier = glob($dossier_images,GLOB_BRACE);
$img_aleatoire = $tab_dossier[array_rand($tab_dossier)];

echo $img_aleatoire;
C'est plus simple, non ? Reste plus ensuite qu'à redimensionner si besoin.

et donc au total :
$dossier = 'PHOTO';
$dossier_images = $dossier.'/*.{jpg,jpeg,gif,png}';

$tab_dossier = glob($dossier_images,GLOB_BRACE);
$img_aleatoire = $tab_dossier[array_rand($tab_dossier)];

$max_width = 100;//maximum largeur acceptable
$max_height = 100;//maximum hauteur acceptable

list($width, $height) = getimagesize($img_aleatoire);
$ratioh = $max_height/$height;
$ratiow = $max_width/$width;
$ratio = min($ratioh, $ratiow);

$ratio = $ratio <= 1 ? $ratio : 1;// uniquement si l'on ne veut pas agrandir les photos de plus petites dimensions que $max_width ou $max_height

$width = intval($ratio*$width);
$height = intval($ratio*$height);

echo '<img src="'.$img_aleatoire.'" width="'.$width.'" height="'.$height.'" alt="image" />';

ViPHP
AB
ViPHP | 5818 Messages

15 sept. 2012, 20:48

Comme ce topic s'adresse à des débutants je précise que le script ci-dessus n'est pas correct si aucune image n'est trouvée dans le dossier cible.
Il faut donc ajouter une petite condition pour qu'il fonctionne dans tous les cas, soit :
$dossier = 'PHOTO';
$ext_ok = array('jpg','jpeg','gif','png');

$dossier_images = $dossier.'/*.{'.implode(',',$ext_ok).'}';
$tab_dossier = glob($dossier_images,GLOB_BRACE);

$tab_dossier = isset($tab_dossier) && is_array($tab_dossier) ? $tab_dossier : array();
if(count($tab_dossier) > 0)
{
	$img_aleatoire = $tab_dossier[array_rand($tab_dossier)];
	
	$max_width = 400;//maximum largeur acceptable
	$max_height = 400;//maximum hauteur acceptable
	
	list($width, $height) = getimagesize($img_aleatoire);
	$ratioh = $max_height/$height;
	$ratiow = $max_width/$width;
	$ratio = min($ratioh, $ratiow);
	
	$ratio = $ratio <= 1? $ratio : 1;// uniquement si l'on ne veut pas agrandir les photos de plus petites dimensions que $max_width et $max_height
	
	$width = intval($ratio*$width);
	$height = intval($ratio*$height);
	
	echo '<img src="'.$img_aleatoire.'" width="'.$width.'" height="'.$height.'" />';
}
else
{
	echo 'Pas de fichier de type '.implode(',',$ext_ok).' dans le répertoire '.$dossier;
        // ou affichage d'une image par défaut provenant d'un autre répertoire
}

Eléphanteau du PHP | 28 Messages

08 nov. 2012, 15:18

Merci :)
J'aurai vu ton message avant, j'aurais pas galéré autant à trouver mon erreur ... quoique lol

Mais attention, ton lien d'exemple ne fonctionne pas (ou plus) ...

Bises !
"En informatique, passer de l’évident à l’utile est une définition vivante du mot « frustration »" [Alan Perlis]