Teen nettisivua yhdelle pikkupuljulle ja tulevalla palvelimella ei tod.näk. tule olemaan tietokantaa, joten tallennettava tieto pitää kikkailla tiedostojen avulla. Sivuille on siis tulossa kuvagalleria, joka on moniulotteinen taulukko muotoa:
$kuvat[id][tyyppi][koko]; //tyyppi arvoltaan 0-1, koko arvoltaan 0-2
Jokaisesta kuvasta siis on kaikissa kolmessa koko-solussa tietoa, ja näistä pitäisi ottaa se 1-avaimella oleva.
Varsinainen ongelmahan on siinä, että tuosta taulukosta voi poistaa tietoa välistä, eli id-arvo ei ole juokseva. Toinen ongelma on siinä, että tyyppi on joko 0 tai 1. Miten löydän ensimmäisen merkkijonon, joka on kooltaan 1 (tyypillä ei ole väliä)?
En itse keksi muuta kuin silmukalla läpikäynnin, mutta periaatteessa sillon se silmukka pitäisi venyttää naurettaviin mittasuhteisiin, sillä muutaman vuoden päästä tuossa voi id-numerot alkaa vaikka kuinka korkeista luvuista.
Edit. käytän sen takia tuota taulukkoa, koska tiedon säilöminen taulukoilla ja serialize-funktiolla tiedostoihin on paljon helpompaa kuin ns. omien formaattien luominen.
Sitten vaan odottamaan koska se sun serialisoitu data kosahtaa ja homma levii käsiin. No ei kai siinä, kunhan muistaa ottaa tarpeeksi usein varmuuskopiot. (tosi järkevää muuten säästää se euro kuussa kun ei ota tietokantaa)
No mut joo, mitäs vikaa siinä silmukan läpikäynnissä on? Tolla rakenteella vaikka käyttäisitkin jotakin hakufunktiota, niin se hakufunktio joutuu joka tapauksessa käymään sen läpi ihan vastaavasti.
<?php $kuvat[7][0][2] = 'reino.jpg'; $kuvat[95][1][1] = 'meiju.jpg'; $kuvat[170][0][0] = 'punppis.jpg'; $eka = false; foreach ($kuvat as $id => $kuva) { foreach ($kuva as $tyyppi => $koot) { if (isset($koot[1])) { $eka = $koot[1]; break; } } if ($eka !== false) break; } if ($eka===false) echo "Kokoa 1 olevaa kuvaa ei löytynyt"; else echo "Ensimmäinen kokoa 1 oleva kuva oli: \$kuvat[$id][$tyyppi][1]='$eka'"; ?>
Tosiaan foreach
ratkaisee tämän id-ongelman, koska olemattomia rivejä ei käydä läpi. PHP:n hienolla breakilla voi hypätä sisemmästäkin silmukasta suoraan ulos asti ilman ylimääräistä iffiä:
Hienoa, muistelinkin että joissain kielissä on tuo mahdollisuus, mutta en muistanut että PHP:ssäkin.
On itsekin kyllä tullut tuota foreachia käytettyä jopa tässäkin koodissa, mutta jostain syystä ei aamuneljältä tullut mieleen. Mitä olen joitain webbihotelleja katsellut niin MySQL-kannasta tulee jopa 50e lisäkustannukset vuodessa. Noh, asiakas ottaa minkä webhotellin haluaa...
Aihe on jo aika vanha, joten et voi enää vastata siihen.