Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Satunnaiskuva

Oikkis [22.12.2004 09:55:51]

#

Simppeli satunnaiskuvan näyttäjä, eli aina sivulle tultaessa hakee määrätystä kansioista satunnaisesti arvotun kuvan.

<?php
//mo's image randomizer, hakee satunnaisen kuvan määrätystä hakemistosta


$hakemisto_polku = "../..";  //hakemiston polku tähän
$hakemisto_kahva = opendir($hakemisto_polku); //asetetaan hakemisto polku kahvaan
$montako_kuvaa = 0;  //laskuri muuttuja kuvien määrän laskemiseksi
$tied_paatteet = array("jpg","gif","png");  //mitkä tiedostot hyväksytään

//käydään kansion tiedostot läpi------------------------------
while ($tiedosto = readdir($hakemisto_kahva)) {

    //haetaan tiedosto nimestä tiedoston pääte
    $tied_paate = substr(strrchr($tiedosto, "."), 1);

    //käydään läpi tiedostojen päätteet
    foreach ($tied_paatteet as $paate) {
            //ja jos sattui olemaan kuva niin laitetaan se arrayhin
            if ($paate == strtolower($tied_paate)){

                $kuvat_array[$montako_kuvaa] = $tiedosto;
                $montako_kuvaa++;

            }
    }

}
closedir($hakemisto_kahva);

//tarkistus löytyikö niitä kuvia ollenkaan...
if ($montako_kuvaa == 0) {

    echo "Ei ole kuvia";

}else{

    $montako_kuvaa--; // vähennetään muuttujasta yksi, muuten satunnaisluku generoituisi liian isolta alueelta

    $s_luku = rand(0 , $montako_kuvaa); //haetaan satunnaisluku väliltä 0- montako kuvaa

    $naytettava_kuva = $hakemisto_polku.$kuvat_array[$s_luku]; //naytettävän kuvan hakeminen
    $alt_teksti = $kuvat_array[$s_luku];   //asetetaan alt teksti kuvan nimestä

    echo '<img src="'.$naytettava_kuva.'" alt="'.$alt_teksti.'"  />'; //tulostetaan kuva
}
?>

Tumpi [22.12.2004 21:22:56]

#

Oma versioni:

<?php

function randomKuva ($polku = "kuvat/", $virhe = "error.jpg", $paatteet = array ("jpg", "jpeg", "gif", "png", "bmp")) {
    $tiedostot = glob ($polku ."*");
    $kuvat = array ();

    if ($tiedostot[0] == "") return $virhe;
    else {
        foreach ($tiedostot as $nimi) {
            $split = explode (".", $nimi);
            if (in_array (strtolower ($split[count ($split)-1]), $paatteet)) $kuvat[] = $nimi;
        }

        if (count ($kuvat) == 0) return $virhe;
        else return $kuvat[rand(0, count ($kuvat)-1)];
    }
}

//näyttää 10 satunnaiskuvaa
for ($i = 0; $i < 10; $i++)
    echo "<img src=\"". randomKuva () ."\">";

?>

ajv [22.12.2004 21:26:17]

#

Kummastakin koodista puuttuu img-tagin vaaditut width- ja height-määritteet :)
Ja tumpi: tuo glob() osaa hakea suoraan ne pelkät kuvatkin sieltä hakemistotsta:

<?
$tiedostot = glob($polku."{*.gif,*.jpg,*.jpeg,*.png,*.bmb,*.GIF,*.JPG,*.JPEG,*.PNG,*.BMB }", GLOB_BRACE);
// tai tämänkin pitäisi toimia (ei toimi jostain syystä itellä):
$tiedostot = glob($polku."{*.[gG][iI][fF],*.[jJ][pP][gG],*.[jJ][pP][eE][gG],*.[pP][nN][gG],*.[bB][mM][bB]}", GLOB_BRACE);
?>

Tumpi [22.12.2004 21:52:23]

#

ajv: ainoastaan alt ja src ovat vaadittuja (omasta versiostani ei alttia löydy, se ei ole koodin kannalta keskeinen asia). :)

Ja tietty onnistuu se tiedostojen haku globilla noinkin, itse valitsin tuollaisen ratkaisun, missä voi sallitut tiedostopäätteet määrittää (mielestäni) helpommin.

Noihin pitäisi lisätä vielä tarkistus kansioiden varalta (esim. kuvat/salakansio.jpg/ sotkee koko homman), jos sellaisia on tuonne ajatellut tunkea, omaani esim. näin:

...
if (in_array (strtolower ($split[count ($split)-1]), $paatteet) && !is_dir ($nimi)) $kuvat[] = $nimi;
...

ajv [22.12.2004 22:39:23]

#

lainaus:

ajv: ainoastaan alt ja src ovat vaadittuja

katoppas, näinhän se onkin :)

Tumpi [23.12.2004 00:27:05]

#

lainaus:

katoppas, näinhän se onkin :)

Juu, välillä voi olla kyllä hyvä määrittää kuville mitat, esim. jos käyttää kuvia sivun elementtien asemoinnissa, jolloin sivu ei hajoa totaalisesti otettaessa kuvien näyttö pois päältä, selaimen pitäisi näyttää tyhjää kuvan mittojen verran.

Jos taas kuva 'leijuu' vapaasti tekstin seassa, on ehkä parempi jättää leveyden sekä korkeuden määrittely pois, jolloin ei näytetä mitään tyhjyyttä ammoittavaa laatikkoa tällaisessa tilanteessa. :)

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta