Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: shuffle ja sivutus

kayttaja-8540 [20.08.2009 16:40:23]

#

Moi

Tein tuossa kuvagalleriaa johon lisäilin kaikenlaisia toimintoja. Yksi niistä on sekoittaa kuvat järjestykseen shufflella ( shuffle($array); ). Minulla on myös sivutus käytössä joten ongelmaksi tulee että kun shuflettaa, niin kuvien järjestys muuttuu joka sivun latauksella joten samoja kuvia voi olla sivulla 2 joita oli myös sivulla 1 jne. Tarkoitus olisi kuitenkin että shufflen alkuperäinen järjestys pysyisi samana huolimatta siitä millä sivulla ollaan niin kauan kunnes taas painetaan shufflea.

Tuli mieleen että jos shufflen järjestyksen vaikka tallentaisi johonkin ja kuljettaisi mukana mutta kysynkin olisiko tähän jotain muuta ratkaisua? Muuten joutuu rajaamaan shufflen 10 kuvaan ja disabloimaan sivutus :/

Merri [20.08.2009 16:55:50]

#

Pseudosatunnaisluku lienee ratkaisu. Niiden ideana on, että tiettyä laskutoimitusta suorittamalla päädytään lopulta tilanteeseen, josta lähdettiinkin. Esim. VB6:n natiivi satunnaislukugeneraattori pystyy muistaakseni vain johonkin 16 000 eri arvoon ennen kuin se "pyörähtää ympäri". Muissa kielissä on yleensä käytössä jokin "vahvempi" satunnaislukugeneraattori. Koska pseudosatunnaisketju pyörähtää aina jossakin vaiheessa ympäri, sille voi syöttää jonkin tietyn siemenluvun, jonka mukaan lähdetään liikkeelle.

Käytännössä voit kirjoittaa jonkin yksinkertaisen pseudolukufunktion, jolle voit syöttää käytössä olevan suffle-luvun ("siemen", tätä pidät esim. tietokannassa tallessa) sekä sivunumeron ja sivuilla näytettävien kuvien määrän. Funktio sitten laskee näiden perusteella, mitkä satunnaisluvut se antaa. Wikipedia selittää lisää.

Teuro [20.08.2009 16:57:45]

#

Entäpä jos teet sekoituksen vain, jos ei ole pyydetty jotakin tiettyä sivua. Vaikkapa seuraavaan tyyliin.

<?php
$kuvat = array();
/* Hae kuvat taulukkoon */
$kuviaSivulla = 10;
$ekaKuva = 0;

if(!isset($_GET['sivu'])){
    $sivu = intval($_GET['sivu']) ? $_GET['sivu'] : 1;
    $ekaKuva = $_GET['sivu'] * $kuviaSivulla;
}else{
    shuffle($kuvat);
}

for($a = $ekaKuva; $a < $kuviaSivulla; $a++){
    /* Tulosta indeksin mukainen kuva */
}

Antti Laaksonen [20.08.2009 17:04:25]

#

kayttaja-8540 kirjoitti:

Tuli mieleen että jos shufflen järjestyksen vaikka tallentaisi johonkin ja kuljettaisi mukana mutta kysynkin olisiko tähän jotain muuta ratkaisua?

Tämä on hyvä ratkaisu, mutta kuten Merri mainitsi, riittää tallentaa satunnaislukugeneraattorin siemenluku.

Jos ennen shuffle-funktiota kutsuu srand-funktiota samalla siemenluvulla, shuffle-funktio sekoittaa taulukon aina samalla tavalla:

<?php
$taulu = array(1, 2, 3, 4, 5);
srand(123); // siemenluku on 123
shuffle($taulu);
print_r($taulu);
?>

Eli voit tehdä niin, että kun käyttäjä haluaa sekoittaa kuvat, arvotaan uusi srand-funktion siemenluku. Sopiva paikka tallentaa siemenluku voisi olla eväste.

Merri [20.08.2009 17:06:36]

#

Hyvä tietää tuosta srand-fuktiosta, en ole vielä tarvinnut satunnaislukuja PHP:lla, mutta eiköhän sekin päivä jossakin vaiheessa tule vastaan :)

kayttaja-8540 [20.08.2009 17:23:23]

#

Kiitos paljon! Srand():llahan tuo hoituu tosi kätevästi :D Meinasin jo ruveta vaikeemman kautta tekemään, onneksi kysyin ensin täältä.

Vastaus

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

Tietoa sivustosta