Gå til innhold

vise tilfeldig bilder på nettside


Anbefalte innlegg

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
Videoannonse
Annonse

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 av BlueEAGLE
Lenke til kommentar

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 av stclem
Lenke til kommentar

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! :D

Endret av BlueEAGLE
Lenke til kommentar

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

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
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 av BlueEAGLE
Lenke til kommentar

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

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...