webForumDet fria alternativet

Random image (även från subfolders)

PHP

7 svar · 512 visningar · startad av Madmartigan

Medlem sedan sep. 200315 inlägg
Frågan#1

Jag har ett php-script som visar en slumpvald bild ur en mapp.
Jag skulle behöva att den även kollade igenom underliggande mappar och visar en slumpvald bild från någon av dessa.
Alltså vilken fil som helst som ligger i mappen (eller undermappar till denna).

Vad behöver jag ändra för att det ska fungera?

<?php
//read folder
$folder=opendir("030804/");
while ($file = readdir($folder))
$names[count($names)] = $file;
closedir($folder);
//sort file names in array
sort($names);
//remove any non-images from array
$tempvar=0;
for ($i=0;$names[$i];$i++){
$ext=strtolower(substr($names[$i],-4));
if ($ext==".jpg"){$names1[$tempvar]=$names[$i];$tempvar++;}
}
//random
srand ((double) microtime() * 10000000);
$rand_keys = array_rand ($names1, 2);
//random image from array
$slika=$names1[$rand_keys[0]];
//image dimensions
$dimensions = GetImageSize($slika);
if (isset($pic)){header ("Location: $slika");}
else {echo "<img src=\"030804/$slika\" $dimensions[3]>";}
?>

Tacksam för snabbt svar.

Medlem sedan aug. 20002 975 inlägg
#2

Testa det här:

function get_files($dir) {

   $names = array();

   if (substr($dir, -1) != '/') {
      $dir .= '/';
   }
   
   if ($folder = opendir($dir)) { 

      while (false !== ($file = readdir($folder))) { 

         if ($file != "." && $file != "..") { 

            if (is_dir($dir.$file)) {

               $names = array_merge($names, get_files($dir.$file));            

            } elseif (strtolower(substr($file,-4)) == '.jpg') {

               $names[] = $dir.$file;

            }

         } 

      } 

      closedir($folder); 

   }
   
   return $names;

}

$names = get_files('bilder');

function cmp($a, $b) {
   $a = substr($a, strrpos($a, '/'));
   $b = substr($b, strrpos($b, '/'));
   return ($a > $b) ? 1 : -1;
}

usort($names, 'cmp');

// Här kan du slumpa

Men jag förstår inte varför du ska sortera, när du ändå bara ska använda arrayen att slumpa från.

Medlem sedan sep. 200315 inlägg
#3

Jag behöver inte sortera, det var bara med en sortering i koden jag hade.
Jag testade din kod, men fick det inte att fungera.
Vart ska jag sätta in (definiera) mitt mapnamn?

Medlem sedan aug. 20002 975 inlägg
#4
$names = get_files('030804/');

Ska du inte sortera så kan du ta bort följande rader:

function cmp($a, $b) {
   $a = substr($a, strrpos($a, '/'));
   $b = substr($b, strrpos($b, '/'));
   return ($a > $b) ? 1 : -1;
}

usort($names, 'cmp');
Medlem sedan sep. 200315 inlägg
#5

Ok, jag har testat den nya koden, men får det inte att fungera. Får inte ens en bruten bild. Ska jag använda något av min gamla kod också?
Kan du klistra in hela den koden jag ska ha, vore jag tacksam.

Medlem sedan aug. 20002 975 inlägg
#6

Använd funktionen get_files() så här:

$names = get_files('030804/');

//random 
srand((float) microtime() * 10000000);
$rand_key = array_rand($names); 
//random image from array 
$slika = $names[$rand_key]; 

//image dimensions 
$dimensions = GetImageSize($slika); 

if (isset($pic)) {
   header("Location: $slika");
} 
else {
   echo "<img src=\"$slika\" $dimensions[3]>";
}
Medlem sedan nov. 200413 inlägg
#7

Jag har försöka använda koden på min dia men jag får den inte att fungera, mappen där bilderna ligger har sökvägen eld/eldbild från filen som ska visa dem.

Hoppas någon vänlig själ kan hjälpa mig med detta.

Medlem sedan aug. 20002 975 inlägg
#8

Kan du visa hur den kod du använde ser ut, samt på vilket sätt det blev fel för dig?

260 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)
119 ms — ändringar (db)