Onko jollakulla ideaa miten saisi pitkään loopilla tulostettavaan listaan lisättyä alaotsikoita.
Eli idea olisi se, että mysqlkannasta haetaan tietoja, jotka sitten tulostetaan while -loopin kanssa. Haluasin kuitenkin tuohon listaukseen aakkoset väliotsikoiksi, eli kun kannasta haetaan tietoja tulee uudella aakkosella alkavien tietojen eteen ensin ko. aakkonen väliotsikoksi. Kun sitten tuo ensimmäien kirjain vaihtuu tulostuu taas ko. aakkonen väliotsikoksi jne.
Onko ideaa miten tuollaisen voi toteuttaa lyhyesti?
Voisit ensin laittaa ensimmäisen rivin ensimmäisen kirjaimen johonkin muuttujaan. Sitten taulua läpi käydessä ennen tulostusta katsot, onko tulostettavan rivin ensimmäinen kirjain sama kuin muuttujassa oleva kirjain. Jos kirjaimet eivät täsmää, niin tulostetaan otsikko (eli nykyisen rivin ensimmäinen merkki), sitten koko rivi, ja asetetaan uusi kirjain siihen kirjainmuuttujaan. Jos kirjaimet taas täsmäävät, tulostetaan vain koko rivi.
Myslitulokset tietenkin kannattaa hakea aakkosjärjestyksessä :)
Minulla on nyt tällainen purkka
$ekakirjain = substr($otsikko, 0, 1); if ($ekakirjain == "a" OR $ekakirjain == "A" AND $ta == ""){ print "<tr><td bgcolor=\"#CCCC99\" colspan=\"3\"><h3>A</h3></td></tr>\n\n"; $ta="1"; } if ($ekakirjain == "b" OR $ekakirjain == "B" AND $tb == ""){ print "<tr><td bgcolor=\"#CCCC99\" colspan=\"3\"><h3>B</h3></td></tr>\n\n"; $tb="1"; } jne.
Tuollainen on siis loopin sisällä.
Miten tuota voisi parantaa / tehdä osittain automaagiseksi ?
Teet siis ensin loopin, jossa käydään kaikki rivit läpi siitä mysql-taulusta. Tämän jälkeen teet looppiin tarkistuksen, että onko käsiteltävän mysql-rivin otsikon eka kirjain sama kuin $ekakirjain -muuttujan arvo. Jos arvot täsmäävät, tulostetaan nykyisestä mysql-rivistä tarvittavat tiedot. Jos arvot eivät taas täsmää, asetetaan $ekakirjain arvoksi nykyisen mysql-rivin otsikon ensimmäinen kirjain, tulostetaan $ekakirjain arvo otsikoksi, sitten vielä tulostetaan rivin tiedot samaan tapaan, kuin jos arvot olisivat täsmänneet.
En täysin käsittänyt mitä haettiin takaa, mutta ainakin koodi:
$ekakirjain == "b" OR $ekakirjain == "B" Muotoon strtolower($ekakirjain) == "b" //strtolower muuttaa kirjaimet pieniksi
Tosin ääkkösissä voi joillain servereillä tulla ongelma, joten ne ehkä pitää tarkastaa tekemälläsi tavalla.
Ja yleensäkin koko rakenteesta, itse varmaan tekisin arrayn jossa on aakkoset, sitten foreachaisin sen ja tarkaistin sen sisällä ne alkukirjaimet.
Ja tämä rakenne
AND $ta == "") { ... $ta = "1"; Ennemmin taulukkoon vaikka näin: AND !in_array(strtolower($ekakirjain), $löydetyt) { ... $löydetyt[] = "a"; //Lisää löydetyt taulukkoon uuden arvon "a"
Tätä varmasti haet takaa, Antti J.N. Täällä voit kokeilla: http://www.arkku.net/~aa-fi/listaus.php.
<?php // Yhdistetään MySQL:ään $yhteys = mysql_connect("localhost", "TUNNUS", "SALASANA") or die("Yhdistäminen ei onnistunut!"); mysql_select_db("TIETOKANTA", $yhteys) or die("Tietokantaa ei löytynyt!"); // Luodaan MySQL-kysely, jossa haetaan "teksti"-sarakkeen sisältö aakkosjärjestyksessä $kysely = mysql_query("SELECT teksti FROM `TAULUN NIMI` ORDER BY teksti"); // Käydään kaikki MySQL-rivit läpi for ($i = 0; $i < mysql_num_rows($kysely); $i++) { // Nykyinen rivi $teksti = mysql_result($kysely, $i, "teksti"); // Katsotaan 1. merkki otsikosta $kirjain = substr($teksti, 0, 1); // Tarkastetaan, kuuluuko nykyinen rivi vanhan otsikon alle if (strtolower($kirjain) == strtolower($otsikkokirjain)) { // Kirjaimet täsmäävät, tulostetaan vain teksti echo " - ".$teksti."<br>\n"; } else { // Kirjaimet eivät täsmää, luodaan uusi otsikko $otsikkokirjain = strtoupper($kirjain); echo "<h2>".$otsikkokirjain."</h2>"; echo " - ".$teksti."<br>\n"; } } mysql_close($yhteys); ?>
Muuten, minkäs takia strtoupper() ei korota ö:tä Ö:ksi?
Bagard kirjoitti:
Muuten, minkäs takia strtoupper() ei korota ö:tä Ö:ksi?
Localesta riippuu, mitkä merkit lasketaan "aakkosiksi", käytännön havaintoesimerkki:
blaze@sakura2 blaze $ php -r 'setlocale(LC_ALL, "C"); echo strtoupper('ö') . "\n";' ö blaze@sakura2 blaze $ php -r 'setlocale(LC_ALL, "fi_FI"); echo strtoupper('ö') . "\n";' Ö
Kiitos Bagard, pääsin siitä ärsyttävästä purkasta eroon :)
Tein pari pientä korjausta omaa sivuani ajatellen, alla tuo koodi jos jotakuta kiinnostaa...
while ($tietue = mysql_fetch_array($kysely)){ $id = $tietue[0]; $otsikko = $tietue[1]; // Tulostetaan aakkoset väliin $kirjain = substr($otsikko, 0, 1); if (strtolower($kirjain) != strtolower($otsikkokirjain)){ if (preg_match("/[a-zA-ZöäåÖÄÅ]/", "$kirjain")){ $otsikkokirjain = strtoupper($kirjain); print "<tr><td align=\"center\" colspan=\"3\"><h2>$otsikkokirjain</h2></td></tr>"; } } print "<tr><td bgcolor=\"$bcolor\"><input type=\"checkbox\" name=\"poistot[]\" value=\"$id\"></td><td bgcolor=\"$bcolor\">$otsikko</td><td bgcolor=\"$bcolor\"><a href=\"$_SERVER[PHP_SELF]?muokattava=$id\">Muokkaa</a></td></tr>\n\n"; }
Aihe on jo aika vanha, joten et voi enää vastata siihen.