stclem Skrevet 28. januar 2009 Del Skrevet 28. januar 2009 Har funnet to script som begge lar meg vise tilfeldige bilder i php, men skulle gjerne hatt funksjoner fra begge. Ønsker å kunne velge antall bilder som i første script, men at den skal lete opp bilder i alle undermapper som i script2. Noen som kan hjelpe meg med å "slå" de sammen? //TILFELDIG BILDE $plassering = 'bilder/'; // Velg en mappe (husk å ha med skråstreken!) $antall_bilder = 4; // Lag et tall for hvor mange bilder vi vil ha $bilder = array(); // Lag et array for å lagre bilder i $formater = array ( 'jpg', 'png', 'gif' ); // Godkjente filtyper // Åpne en mappe if ($mappe = opendir ( $plassering ) ) { // Loop gjennom alle filene i mappen while ( ($fil = readdir ( $mappe ) ) !== false ) { // Sjekk om denne filen er et bilde $filtype = strtolower ( substr ( $fil, -3 ) ); if ( in_array ( $filtype, $formater ) ) { // Legg til bildet i arrayet $bilder[] = $plassering . $fil; } } } // Lukk mappen closedir ( $mappe ); // Skriv ut noen tilfeldige bilder $thumbnails = array_rand ( $bilder, $antall_bilder ); foreach ( $thumbnails as $indeks ) { echo '<img src="' . $bilder[$indeks] . '" alt="Bilde nummer ' . $indeks . '" width="150" border="0"/><br>' . $bilder[$indeks] . '<br><br />'; } } ?> <?php $images = array(); $types = array('.jpg','.gif','.bmp','.jpeg','.png'); // Image types to fetch function dirSearch($dirpath){ global $images, $thumbdir, $types; $dh = scandir($dirpath); // Read the contents into an array array_shift($dh);array_shift($dh); // Remove the '.' and '..' foreach($dh as $item){ if(is_dir("$dirpath/$item")){ // Another dir so check that as well dirSearch("$dirpath/$item"); }else{ // First check if we're in a thumbnail dir and if so check the filetype if(in_array(strtolower(strrchr($item,".")),$types)){ $images[] = "$dirpath/$item"; } } } } dirSearch('./bilder'); // Directory to start search from $img = $images[rand(0,count($images)-1)]; // Choose random image $file = file_get_contents($img); // Read image file into string $type = strtolower(strrchr($img,".")); // Output header depending on type switch($type){ case '.jpg': case '.jpeg': header('Content-type: image/jpeg'); break; case '.gif': header('Content-type: image/gif'); break; case '.bmp': header('Content-type: image/bmp'); break; case '.png': header('Content-type: image/png'); break; } echo $file; // Output actual image ?> Lenke til kommentar
BlueEAGLE Skrevet 31. januar 2009 Del Skrevet 31. januar 2009 (endret) Jeg lagde heller noe som var bedre fra grunn av <?php $grunnmappe = 'bilder/'; $fil_typer = array('jpg', 'jpeg', 'gif', 'png'); $bilde_liste = array(); $antall_bilder = 2; //Hent liste over bilder $bilde_liste = les_katalog($grunnmappe, $fil_typer); //Velg ut X tilfeldige bilder (men aldri samme bildet to ganger) $valgte_bilder = hent_tilfeldige_filer($bilde_liste, $antall_bilder); var_dump($valgte_bilder); //Denne funksjonen returnerer en matrise (array) som //inneholder alle filnavn med ending som angitt i matrisen //$fil_typer i katalogen $katalog. //Hvis $les_udnerkataloger ikke blir satt til false så blir //underkataloger også lest. //Navnene inneholder katalognavn fra bunn av $katalog. function les_katalog($katalog, $fil_typer, $les_underkataloger=true) { //Husk å sjekke at du faktisk får et resultat her. if(($fil_liste = scandir($katalog))===false) return false; foreach($fil_liste as $fil) { //Vi skal ikke gå oppover i treet eller lese denne katalogen en gang til if(($fil !=='.')&&($fil !=='..')) { $fil = $katalog.$fil; //Legg til filer fra en underkatalog hvis vi skal ha dem med. if((is_dir($fil))&&($les_underkataloger==true)) { $bilde_liste = array_merge($bilde_liste, les_katalog("$fil/", $fil_typer)); } else { $fil_info = pathinfo($fil); //Sjekk at det er en gyldig bildefil if(in_array($fil_info['extension'], $fil_typer)) { $bilde_liste[]=$fil; } } } } return($bilde_liste); } //Denne funksjonen henter et gitt antall tilfeldige bilder //fra en matrise som inneholder filnavn og den vil aldri //returnere det samme bildet to ganger i ett utvalg med //mindre du spesifiserer at den skal gjøre det ved å sette //$fjern_valgte = false i funksjonskallet. function hent_tilfeldige_filer($fil_liste, $antall = 1, $fjern_valgte = true) { $fil_teller = 0; while(($fil_teller < $antall) && !empty($fil_liste)) { $index = rand(0, count($fil_liste)-1); $valgte_filer[] = $fil_liste[$index]; unset($fil_liste[$index]); //Gjør slik at indekseringen er kontinuerlig $fil_liste = array_merge($fil_liste); $fil_teller++; } return($valgte_filer); } ?> Grunnen til at jeg gjorde det er fordi min kode * Bruker ingen globale variabler som den forrige rekursive funksjonen gjorde. * Går ikke ut i fra at grunnkatalogen ikke er root (sjekker eksplisitt etter .. som ikke eksisterer i root) * Bruker lange variabelnavn slik at koden er lesbar * Returnerer ikke samme bilde i ett utvalg * Tryner ikke hvis du ber om å få fler bilder enn det eksisterer i katalogen(e) Hvis du synes denne insatsen er verdt noe så setter jeg pris på om du donerer noen kroner til frelsesarmeen eller gir noen ting du ikke bruker lenger til freetex. Endret 31. januar 2009 av BlueEAGLE Lenke til kommentar
stclem Skrevet 31. januar 2009 Forfatter Del Skrevet 31. januar 2009 (endret) fantastisk, hvis den hadde virket. Står bare NULL på nettsiden. Mappene er bygd opp slik 1.mappe bilder -- 2.undermappe 2008 --- 3.undermappe jula ---- 4.bildefiler --- 3.undermappe ferie ---- 4.bildefiler -2.undermappe 2007 --- 3.undermappe ferie ----4.bildefiler osv. Endret 31. januar 2009 av stclem Lenke til kommentar
BlueEAGLE Skrevet 1. februar 2009 Del Skrevet 1. februar 2009 (endret) Da har du ikke angitt riktige filtyper eller rett grunnmappe i forhold til scriptet. <?php $grunnmappe = 'bilder/'; $fil_typer = array('jpg', 'jpeg', 'gif', 'png'); $bilde_liste = array(); $antall_bilder = 2; //Hent liste over bilder $bilde_liste = les_katalog($grunnmappe, $fil_typer); if(!$bilde_liste) die("finner ikke $grunnmappe"); //Velg ut X tilfeldige bilder (men aldri samme bildet to ganger) $valgte_bilder = hent_tilfeldige_filer($bilde_liste, $antall_bilder); var_dump($valgte_bilder); //Denne linjen må byttes ut med kode som faktisk viser bildet ... ...se også denne lenken! Endret 1. februar 2009 av BlueEAGLE Lenke til kommentar
stclem Skrevet 1. februar 2009 Forfatter Del Skrevet 1. februar 2009 får det ikke til,, uansett kommer det bare NULL når jeg kjører det. Alle filer er i jpg format og mappenavnet er rett. Peker jeg $grunnmappe inn i mappa med filer får jeg følgende array(1) { [0]=> string(37) "bilder/2008/sofie/081012 415 kopi.jpg" } Array Lenke til kommentar
fezken Skrevet 1. februar 2009 Del Skrevet 1. februar 2009 Hvilken php versjon har du på serveren din ? Lenke til kommentar
stclem Skrevet 1. februar 2009 Forfatter Del Skrevet 1. februar 2009 PHP Version 5.2.6 System Windows NT LAGER 5.1 build 2600 Build Date May 2 2008 18:01:20 Configure Command cscript /nologo configure.js "--enable-snapshot-build" "--with-gd=shared" "--with-extra-includes=C:\Program Files (x86)\Microsoft SDK\Include;C:\PROGRA~2\MICROS~2\VC98\ATL\INCLUDE;C:\PROGRA~2\MICROS~2\VC98\INCLUDE;C:\PROGRA~2\MICROS~2\VC98\MFC\INCLUDE" "--with-extra-libs=C:\Program Files (x86)\Microsoft SDK\Lib;C:\PROGRA~2\MICROS~2\VC98\LIB;C:\PROGRA~2\MICROS~2\VC98\MFC\LIB" Server API Apache 2.0 Handler Virtual Directory Support enabled Configuration File (php.ini) Path C:\WINDOWS Loaded Configuration File C:\PHP\php.ini PHP API 20041225 PHP Extension 20060613 Zend Extension 220060519 Debug Build no Thread Safety enabled Zend Memory Manager enabled IPv6 Support enabled Registered PHP Streams php, file, data, http, ftp, compress.zlib Registered Stream Socket Transports tcp, udp Registered Stream Filters convert.iconv.*, string.rot13, string.toupper, string.tolower, string.strip_tags, convert.*, consumed, zlib.* Lenke til kommentar
BlueEAGLE Skrevet 1. februar 2009 Del Skrevet 1. februar 2009 (endret) får det ikke til,, uansett kommer det bare NULL når jeg kjører det. Alle filer er i jpg format og mappenavnet er rett. Peker jeg $grunnmappe inn i mappa med filer får jeg følgende array(1) { [0]=> string(37) "bilder/2008/sofie/081012 415 kopi.jpg" } Array Ja og hvis du leser scriptet så er det det som det er meningen at du skal få. Du ser linjen som starter med var_dump? Den må du selvfølgelig bytte ut med html-kode for å vise de bildene som er valgt. Jeg la ikke den koden til fordi jeg visste ikke hvordan du ville ha de bildene formatert. Det hjelper oss å hjelpe deg om du leser manualen. Se også denne lenken en gang til! edit: ...ok, da så skal jeg skjemme deg bort litt mer, men du LÆRER ikke PHP av å bare klippe og lime sammen ting du ikke forstår hvordan virker! bytt ut var_dump-linjen med: foreach ($valgte_bilder as $bilde_fil) { echo "<img src=\"$bilde_fil\" alt=\"$bilde_fil\"><br>"; } Endret 1. februar 2009 av BlueEAGLE Lenke til kommentar
stclem Skrevet 1. februar 2009 Forfatter Del Skrevet 1. februar 2009 får den fortsatt ikke til å virke når jeg legger inn $grunnmappe bilder/ som er hovedmappa tilb bildene. Når jeg legger inn direkte adresse til en bestemt mappe som inneholder bildefiler så kommer et bilde opp, og det er det samme bildet hver gang. Lenke til kommentar
BlueEAGLE Skrevet 2. februar 2009 Del Skrevet 2. februar 2009 Da går du på vis kilde for siden og ser at når du ikke har noen filer (bare kataloger) i bildemappen din så får du feilmeldingen Warning: array_merge(): Argument #1 is not an array in /home/blueeagle/source/test/bildeliste.php on line 36 Den oppstår fordi linjen $bilde_liste = array_merge($bilde_liste, les_katalog("$fil/", $fil_typer)); ikke klarer å lage en matrise når det første argumentet ikke allerede er en matrise. Løsningen er simpelten å sette $bilde_liste til en tom matrise i starten av funksjonen. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå