Mitenköhän tämän toteuttaisi järkevästi? Eli tarkoitus olisi tehdä sivutuksella varustettu galleria, jossa näytetään kuvia kolme rivissä ja rivejä on kolme. Sain itse tiettyyn pisteeseen saakka tätä galleriakoodia, mutta nyt se näyttää vain kolme samaa kuvaa yhdeksän kertaa (mikä on ymmärrettävää, kun lukee alla olevaa koodia), mutta kuinka saisin sen näyttämään kaikki kansion kuvat ja niin, että se näyttää vain yhdeksän kuvaa kerrallaan per sivunumero?
<?php $lol = ""; $kategoria = ""; if(isset($_GET['nimi']) && !empty($_GET['nimi'])) { $kategoria = $_GET['nimi']; foreach (glob("kuvat/" . $kategoria . "/*") as $filename) { $lol = $lol . $filename . "|"; } $kuvat = explode("|", $lol); $maara = count($kuvat); echo $maara; for($j = 0; $j <= 2; $j++) { echo '<tr>'; for($i = 0; $i <= 2; $i++) { echo '<td><img src="' . $kuvat[$i] . '" width="150" height="150"></td>'; } echo '</tr>'; } } ?>
<?php $kategoria = ""; if(isset($_GET['nimi']) && !empty($_GET['nimi'])) { $kategoria = $_GET['nimi']; foreach (glob("kuvat/" . $kategoria . "/*") as $filename) { $kuvat[] = $filename; } $maara = count($kuvat); echo $maara; for($j = 0; $j <= 2; $j++) { echo '<tr>'; for($i = 0; $i <= 2; $i++) { echo '<td><img src="' . $kuvat[$i] . '" width="150" height="150"></td>'; } echo '</tr>'; } } ?>
Kirjoitin tuon hieman uudestaan saat itse päätellä mitä muutin ja ennen kaikkea miksi. Vinkin voin antaa, että foreach rakenteessa sijoitat muuttujaan aina saman arvon. Ylipäätän tuollaiset muuttujat, kuten $lol yms ovat merkki huonosti suunnitellusta ohjelmasta. Tämä on siis oma mielipiteeni.
Oikeiden kuvien tulostamista helpottaa, jos erotat koodista kuvan tulostamisen ja taulukon rakenteen. Tee siis ensin erikseen koodi, joka osaa tulostaa yhden kuvan oikein sen indeksin perusteella, ja liitä tuo koodi sitten silmukkaan, jossa tulostetaan yhdeksän kuvaa. Tällä tavalla voi myös vaivattomasti muuttaa taulukon kokoa tai muotoa (3x3 => 1x9 tai 2x4) ilman, että kuvakoodiin tarvitsee koskeakaan.
Sivuja varten tarvitaan tietenkin osoitteeseen muuttuja, josta selviää, mikä on ensimmäinen kuva. Tähän kelpaa joko suoraan kuvan numero, jolloin käyttäjä voi nähdä mitkä tahansa yhdeksän kuvaa, siis 0-8 tai vaikkapa 3-11, tai sivunumero, jolloin käyttäjä näkee aina juuri tietyn sivun eli kuvasarjan, esimerkiksi 0-8, 9-17 jne.
<?php # Taulukon koko $w = 3; $h = 3; # Mistä alkaa? if (empty($_GET['ensimmainen'])) { $kuva = 0; } else { $kuva = $_GET['ensimmainen']; } # Uudet linkit $viimeinen_kuva = $kuvien_maara - 1; if ($kuva > 0) { $edelliset = "kuvat.php?ensimmainen=".max($kuva - $w * $h, 0); } if ($kuva < $viimeinen_kuva) { $seuraavat = "kuvat.php?ensimmainen=".min($kuva + $w * $h, $viimeinen_kuva); } # Taulukko for ($i = 0; $i < $h; ++$i) { echo "<tr>\n"; for ($j = 0; $j < $w; ++$j) { echo "<td>"; # Kuvan tulostus hoidetaan erillisen indeksin ($kuva) perusteella, # ja siihen tarvittava koodi ei ole mitenkään riippuvainen taulukon muodosta tulosta_kuva($kuva); ++$kuva; echo "</td>\n"; } echo "</tr>\n"; } ?>
Teuron korjaus taulukon käyttöön globissa pystyviivaerottimen ja exploden sijaan on varsin paikallaan, mutta se ei nyt osunut asian ytimeen. Itse kuvien tulostamista ei tuossa korjattu, ja siksipä kesti hetki ihmetellessä, mikä tuossa nyt niin olennaisesti parempaa oli. Taulukkokin pitäisi muuten luoda, $kuvat = array();
Aihe on jo aika vanha, joten et voi enää vastata siihen.