PHP:A-Z: Unterschied zwischen den Versionen
Lukas (Diskussion | Beiträge) Die Seite wurde neu angelegt: „== Problem-Beschreibung == Neulich hatte ich das Problem auf einer Webseite eine A-Z-Link-Liste zu bauen. Nun wollte ich das nicht alles mit HTML machen. In de…“ |
Lukas (Diskussion | Beiträge) KKeine Bearbeitungszusammenfassung |
||
Zeile 77: | Zeile 77: | ||
[[Datei:nicht-a-z.png]] | [[Datei:nicht-a-z.png]] | ||
Version vom 1. September 2012, 12:20 Uhr
Problem-Beschreibung
Neulich hatte ich das Problem auf einer Webseite eine A-Z-Link-Liste zu bauen. Nun wollte ich das nicht alles mit HTML machen. In dem Dokument sind die Buchstaben A-Z jeweils so als Überschrift-Link angegeben:
<a name="A"><h2>A</h2></a>
So zieht sich das dann durch das gesamte Dokument. Ich habe also gedacht, dass ich das mit einer while-Schleife lösen könnte. Tat ich dann auch:
<?php $ascii = "65"; $ende = "90"; while ($ascii <= $ende) { echo "<a href=\"#" . chr($ascii) . "\">" . chr($ascii) . "</a> "; $ascii++; } ?>
Mal im Einzelnen
Mit dem Tag
<?php
und
?>
öffne und schließe ich den PHP-Tag.
Definition
Dann geht es weiter mit der Definition der Variablen $ascii und $ende. Diese sollen später den Anfang und das Ende der while-Schleife festlegen. Hierbei stehen die beiden Zahlen für Buchstaben in der ASCII-Tabelle, wobei 65 für A und 90 für Z steht.
while
Nun geht es los mit der while-Schleife. Diese wird ausgeführt, wenn $ascii kleiner oder gleich $ende ist. Da die Variable $ascii bei jedem Schleifen-Durchlauf um einen erhöht wird (dazu mehr weiter unten), ist $ascii irgendwann so groß, wie $ende und bildet dadurch das Ende der Schleife. Würde man hier nur
while($ascii < $ende)
schreiben, würde das Alphabet nach Y aufhören. Man könnte zwar $ende auf 91 setzen, aber die Lösung mit
while($ascii <= $ende)
ist da meiner Meinung nach schöner.
echo
Bei jedem Durchlauf wird ein Link ausgegeben. Dieser Link leitet dann auf den Link des jeweiligen Buchstabens. Bei HTML kann man Links mit dem Attribute "name" benennen und über ein #LINK-NAME hinter der URL auf den jeweiligen Link leiten. Also gibt der echo-Befehl bei jedem Durchlauf einen Link mit dem Link-Namen $ascii aus. Aber halt! So wird ja nur die Zahl ausgegeben. Hier kommt uns dann die Funktion
chr
zu Gute. Damit wird die jeweilige Zahl in das entsprechende ASCII-Zeichen umgewandelt. (chr steht für character)
Also schreibt man für die Ausgabe der Variable $ascii als Buchstaben:
chr($ascii)
++
Damit wir nicht ewig lang immer den Buchstaben A ausgeben (und das sollten wir auch nicht, da es sich dann um eine Endlosschleife handelte und der Server (oder nur Apache) dann möglicherweise abstürzt), wird am Ende eines jeden Durchlaufs noch die Variable $ascii um einen erhöht. Hierfür schreiben wir einfach ein ++ hinter die Variable. Also:
$ascii++;
Man könnte das Alphabet auch rückwärts laufen lassen, in dem man die Variablen vertauscht (also $ascii = "90" und $ende = "65") und $ascii dann mit jedem Durchlauf verringert ($ascii--).
Ergebnis
Das Ergebnis sieht dann mit ein bisschen CSS-Ergänzungen so aus:
Mögliche Ergänzungen
Auslassung einiger Buchstaben
Wenn man nicht das volle Alphabet ausgegben haben möchte, kann man mit Hilfe einer if-Bedingung die Ausgabe eingrenzen. Hier kann man das folgende verwenden:
<?php $ascii = "65"; $ende = "90"; while ($ascii <= $ende) { if ($ascii=="74" or $ascii=="78") { echo "<a class=\"nicht\">" . chr($ascii) . "</a> "; } else { echo "<a href=\"#" . chr($ascii) . "\">" . chr($ascii) . "</a> "; } $ascii++; } ?>
Hier ist die Grundstruktur die gleiche. Allerdings wird vor der Ausgabe der Buchstaben gecheckt, ob sie ausgegeben werden sollen. Hierfür verwenden wir eine if-Bedindung. Wenn die Variable $ascii 74 (=J) oder 78 (=N) ist, wird der Buchstabe als ein Link mit der Klasse "nicht" und ohne Verweis ausgegeben. Per CSS kann man dann den Link zum Beispiel ausgrauen.
Falls aber die Variable nicht 74 und nicht 78 ist, kommt die else-Variante in Gebrauch. Hier wird der Link dann, wie vorher ausgegeben.
Ergebnis
Hier sieht man das Ergebnis. Die Buchstaben J (=74) und N (=78) sind ausgegraut (also mit der Klasse "nicht" versehen).