Die dritte Lektion: Strings und Arrays

tempa wrote this 13:25:

Die Variablentype String (auf deutsch: Zeichenkette) haben wir bereits kennengelernt und eingesetzt. Schauen wir uns den Variablentyp jetzt etwas genauer an. Strings werden mit Anführungszeichen eingeleitet. Doppelte Anführungszeichen werden auf PHP-Code in der Zeichenkette (string) hin untersucht. In Zeichenketten können Variablen und Anweisungen vorkommen. Wenn Steuerzeichen in einer Zeichenkette vorkommen, die als Zeichen interpretiert und nicht als Steuerzeichen, dann muss das Zeichen mit einem Gegenschrägstrich (backslash) maskiert werden, andere Zeichen werden als Zeichen interpretiert und damit sie als Steuerzeichen erkannt werden müssen sie mit einem Gegenstrich (Backslash) maskiert (escaped) werden. In der folgenden Tabelle ist eine Liste der Steuerzeichen.

Spezielle Steuerzeichen / Sonderzeichen
Code Erläuterung
\n Neue Zeile Linefeed (LF, 0x0A)
\r Absatz Carriage return (CR, 0x0D)
\t Horizontaler Tab (HT, 0x09)
\\ Gegenstrich (Backslash) schreiben
\$ Dollar schreiben statt Variable interpretieren
\" Anführungszeichen schreiben statt Zeichenkette zu beenden

Für unseren aktuellen Stand ist die Liste erst einmal ausreichend, die vollständige Liste findet ihr unter Variablentypen: String

Strings können auch von einzelnen Anführungszeichen, Hochkommatas, umschlossen werden, dann werden Sonderzeichen mit Ausname der Maskierungen des Gegenschrägstrichs (\\) und dem Hochkommata (\') und Variablen nicht interpretiert. Variablen werden bei einzelnen Hochkommatas in Zeichenketten über einen Punkt zwischen zwei durch Hochkommatas abgeschlossene Zeichenketten eingefügt. Achten Sie auf die Anführungszeichen, Gegenschrägstriche und Punkte, die Ausgabe ist in den grünen Kommentaren der echo-Anweisung nachgestellt.

  1. $var = "Anna";
  2. echo "Hier betreut Sie $var."; // Hier betreut Sie Anna.
  3. echo "Hier betreut Sie \$var."; // Hier betreut Sie $var.
  4. echo 'Hier betreut Sie '.$var.'.'; // Hier betreut sie Anna.
  5. echo 'Hier betreut Sie $var.'; // Hier betreut Sie $var.
  6. echo 'Darstellung in \'\' von \\\' durch \\\\\\\'';
    // Darstellung in '' von \' durch \\\''

Ein Gegenschrägstrich (Backslash „\„) in Hochkommata (single Quotes) muss nicht notwendiger Weise in allen Fällen maskiert werden, wenn aber Ausgegeben werden soll, wie man Hochkommatas maskiert in Hochkommata mit echo, dann kann das zu exzessivem Maskieren von Gegenschrägstrichen und dem Hochkommata führen. Es bedarf sieben Gegenschrägstriche und ein Hochkommata um \\\' in Hochkommata zu schreiben, für jeden der drei Gegenschrägstriche einen Maskierungs-Gegenschrägstrich und einen Maskierungs-Gegenschrägstrich für das Hochkommata.

In dem nachfolgenden Codeblock sind zwei nützliche Dinge mehrzeilige Kommentare zum ein und ausblenden von Funktionen im Script und die mehrzeilige String-Variable:

  1. // Kommentartrick zum temporären Auskommentieren
  2. /**
    /
    // Mehrzeiliger Kommentar:
    echo <<<VARNAME
    Diese echo-Anweisung ist auskommentiert und alles was es braucht, die echo-Anweisung wieder scharf zu schalten, ist die einzelnen Schrägstriche am Anfang und am Ende in eine Zeile wie folgt /**/ zu nehmen. In der Entwicklungsphase eines Scripts ist das sehr nützlich.
    VARNAME;
    /
    **/

Der mehrzeilige Kommentar ist nicht nur um im Kopf des Skriptes für Metatext zum Skript geeignet, sondern auch um schnell Codeteile zu deaktivieren und aktiveren, z.B. um in der Entwicklungsphase Variationen zu testen oder Fehlerquellen zu identifizieren und eliminieren.

Hier auskommentiert ist die HEREDOC Variable, mit der große Textblöcke, wie z.B. ganze Webseiten-Inhalte in eine Variable gespeichert und abhängig von Parametern wieder ausgegeben werden können. Die Syntax einer HEREDOC beginnt mit drei einleitenden öffnenden spitzen Klammern (<<< drei lower than) unmittelbar gefolgt vom Variablennamen, der nicht in Großbuchstaben geschrieben werden muss, aber der besseren Lesbarkeit wegen zum Quasistandard wurde. Geschlossen wird die HERDOC-Variable mit dem Variablennamen am Beginn der Zeile und mit einem abschließenden Semikolon. Vor dem schließenden Variablennamen darf kein Zeichen stehen auch kein Leerschritt und der Variablenname ist case-sensitive, d.h. auf Groß- und Kleinschreibung ist daher sorgfältig zu achten.

Die HEREDOC interpretiert wie die Stringvariable mit doppelten Anführungszeichen Variablen und gibt deren Inhalte wieder. Bein einfachen Variablen genügt es einfach die Variable im HEREDOC-String zu schreiben, wenn es aber ein Wert au eunem Array ist mit dem nachgestellten Index in eckigen Klammern nach dem Variablennamen, dann muss die Variable von geschweiften Klammern umschlossen werden. Folgt kein Dollarzeichen auf die geschweifte Klammer interpretiert PHP die geschweifte Klammer nicht als ein Steuerzeichen, weswegen auch keine Funktionen innerhalb von HEREDOC interpretiert werden. Man kann das Ergebnis einer Funktion in eine Variable speichern und dann die Variable einfügen oder aber einen Trick verwenden und den Funktionsnamen in in einer Variable speichern.

So ein Textbaustein in einem Bestellvorgang hat oft variable Module. Der Kundenname aus eunem Array, ein Texbaustein vie z.B. die obfuscated (=vernebelte) E-Mailadresse, der noch an anderer Stelle als im Bestelltext verwendet wird, oder die von Auftragsaufkommen und Feiertagen abhängige Lieferzeit, die über strtoupper hervorgehoben werden.

  1. $kunde['voname'] = "Anne";
  2. $mailto = <<<MAILTO
  3. <script>
  4. document.write("<n uers=\"znvygb:vasb@znvy.qr\" ery=\"absbyybj\">vasb@znvy.qr</n>".replace(/[a-zA-Z]/g,
  5. function(c){return String.fromCharCode((c<="Z"?90:122)>=(c=c.charCodeAt(0)+13)?c:c-26);}));
  6. </script>
  7. MAILTO;
  8. $tage = array('fünf',5);

Der Liefertag, der für die Kunden errechnet und als Datum angezeigt wird, der Funktionsname „date“, weil die Datumsfunktion in so manchem HEREDOC nützlich sein mag, ebenso wie einen Text mit „strrev“ durch umkehren vor Spambots verstecken.

  1. $liefertag = time()+($tage[1]*24*60*60);
  2. $fn_date = 'date';
  3. $fn_strrev = 'strrev';
  4. $nochtage = strtoupper($tage[0]." Tagen");

Diese Variablen, Array-Werte, Javascripts und PHP-Funktionen können dann in geschweiften Klammern ({$ ... }) in den HEREDOC-Textbaustein eingebunden werden:

  1. echo <<<HEREDOC
  2. Herzlich Willkommen {$kunde['voname']},<br>
  3. Ihre Lieferung kommt nach <b>{$nochtage}</b>.<br>
  4. Wenn sie heute bestellen liefern wir spätestens am: {$fn_date("d.m.Y", $liefertag)}<br>
  5. Ihre Bestellung senden sie an die E-Mail: $mailto<br>
  6. <noscript><span class="strrev">{$fn_strrev('info@mail.de')}</span></noscript>
  7. HEREDOC;

Auch PHP-Objekte lassen sich einbinden, aber das ist etwas für später.
Jetzt ist es an der Zeit sich Arrays näher anzusehen.

Ein Array ist ein Set von Werten, ein Wert kann selbst ein Array sein. Ein Array (Variablen-Set) wird über die Funktion array() deklariert oder in dem ein Array-Wert zugewiesen wird. Dazu stellt man dem Variablennamen den Index in eckigen Klammern nach. Auch einem bestehenden Array kann ein zusätzlicher Wert so hinzugefügt werden. Array-Werte können innerhalb eines Arrays jedem Variablentyp angehören.

Der Array-Index mit dem die Array-Werte angesprochen werden können, kann numerisch oder ein Text sein. Wird z.B. ein Array über eine Kommaliste erstellt, werde die Werte mit 0 beginnend durchgezählt.

  1. $adressliste = array("Manfred", "Mustermann", "Mustermanngasse", 27, 71234, Musterstadt, 01234, 54321, "info", "domain.tld");
  2. echo <<<ADRESSE
  3. Name: {$adressliste[0]} {$adressliste[1]}<br>
  4. Straße: {$adressliste[2]} {$adressliste[3]}<br>
  5. Ort: {$adressliste[4]} {$adressliste[5]}<br>
  6. Fon: {$adressliste[6]} / {$adressliste[7]}<br>
  7. E-Mail: {$adressliste[8]}@{$adressliste[9]}<br>
  8. Website: www.{$adressliste[9]}<br>
  9. ADRESSE;

Adressdaten werden in den unterschiedlichsten Formationen überall auf der Site eingesetzt, sie in einem Array abzuspeichern macht durchaus Sinn, einfacher zu handhaben ist so ein Array mit einem beschreibenden Array-Index. Der beschreibende Textindex in Anführungszeichen wird gefolgt von einem Gleichheitszeichen und der schließenden spitzen Klammer, dem so ein Wert zugewiesen wird:

  1. $adrdats = array(
  2. 'vorname' => 'Manfred',
  3. 'nachname' => 'Mustermann',
  4. 'strasse' => 'Mustergasse',
  5. 'hausnr' => 27,
  6. 'plz' => 71234,
  7. 'ort' => 'Musterstadt'
  8. );
  9. echo <<<ADRESSE
  10. {$adrdats['vorname']} {$adrdats['nachname']}<br>
  11. {$adrdats['strasse']} {$adrdats['hausnr']}<br>
  12. {$adrdats['plz']} {$adrdats['ort']}
  13. ADRESSE;

Ein Array in einem Array wird mit der Anweisung array() erstellt und kann ein array mit beschreibenden Index oder eine einfache Komma getrennte Liste:

  1. $name = array(
  2. 'titel' => array(
  3. 'adel' => 'Baron',
  4. 'akad' => 'Dr. Dr.'),
  5. 'vornamen' => array('Manfred','Ernst','August'),
  6. 'adelszusatz' => 'von',
  7. 'nachname' => 'Mustermann'
  8. );
  9. echo $name['titel']['adel']." ".$name['vornamen'][0]." ".substr($name['vornamen'][1],0,1).". ".substr($name['vornamen'][2],0,1).". ".$name['adelszusatz']." ".$name['nachname'];
  10. // Ausgabe: Baron Manfred E. A. von Mustermann

Neben der Möglichkeit Array-Werte direkt über den Index (Schlüsselwert) in eckige Klammern anzusprechen, kann man einen Array auch einmal komplett abarbeiten, hierzu gibt es mehrere Funktionen, z.B. die Funktion foreach:

  1. <ul class="navigation">
  2. <?php $seiten = array('home','angebot','philosophie','kontakt','impressum');
  3. foreach($seiten as $value){
  4. echo "<li><a href=\"./?$value\">".strtoupper($value)."</a></li>";
  5. } ?>
  6. </ul>

So sieht das dann aus:   foreach Demo

Das starke an PHP ist, dass man Daten an einer Stelle deponiert und dann auswertet, also keine 10 Seiten ertellen muss, sondern nur eine. Damit aber PHP reagieren kann, muss mit der Adresse zur Datei ein Parameter-Wert übergeben werden. Alles was der Browser zum Server sendet, kann der PHP-Interpreter auf dem Server auch auswerten. Nicht zum Server gesendet wird der Anchor (#anchor). Der wird nur lokal vom Browser genutzt um innerhalb der Seite zu navigieren, ist also ungeeignet. Um der PHP-Seite einen Wert zu übergeben, gibt es das Fragezeichen.

Wenn wir in Google nach „Url auslesen mit PHP“ forschen, stoßen wir auf $_SERVER['REQUEST_URI']. Diese Variable gibt uns, wenn wir in der Demo z.B. auf ‚Kontakt‘ klicken das folgende aus: „/blog/demo/1stpage/foreach.php?kontakt„. Alles was nach dem Fragezeichen kommt kann der Server also verarbeiten. Aber Vorsicht, In die Browserzeile können böse Besucher alles eingeben, auch schädliche Scripte. Egal also was wir damit machen, es muss erst einmal mit einem Filter gegen Schadhaftes bearbeitet werden:

  1. echo filter_var($_SERVER['REQUEST_URI'],FILTER_SANITIZE_STRING);

Wer jetzt im letzten Beitrag auf der Übersicht der Stringfunktionen war, der hat mit strstr und substr zwei Funktionen im Werkzeugkasten, um die aktuelle Seite zu ermitteln.

  1. $seitenurl = filter_var($_SERVER['REQUEST_URI'],FILTER_SANITIZE_STRING);
  2. $aktuell = substr(strstr ($seitenurl,"?"),1);
  3. $seite = ($aktuell == false)? "index" : $aktuell ;

Jetzt haben wir 1. die Url samt Parameter ermittelt, 2. per strstr (Finde das Fragezeichen und merke Fragezeichen plus Rest vom String) und substr (Lass das erste Zeichen, welches das gesuchte Fragezeichen ist, weg. Und nach dem wir nun die aktuelle Seite kennen, wenn ein Link geklickt und ein Fragezeichen vorhanden ist, müssen wir auch noch sicherstellen, dass unser Script weiß, was Sache ist, wenn 3. in der Url _kein_ Fragezeichen ist, also wenn $aktuell den boolschen Wert „false“ hat. Dann weisen wir abhängig von der Shorthand if-Klausel den Wert der $seite direkt oder dynamisch zu.

Nun haben wir die Fälle abgedeckt, für die wir eine Seite haben. Was aber ist, wenn die Seite nicht existiert? Legen wir eine 404-Seite fest bzw. legen den 404-Inhalt fest, wenn der Wert nicht im Array existiert.

  1. echo in_array($seite,$seiten) ? $inhalt[$seite] : $inhalt_fehler404 ;

Die Seiteninhalte müssen nun nur noch in einer HEREDOC-Variable abgespeichert werden und fertig ist der Baukasten für eine kleine eindimensionale Website:   Kleine Website Demo

Dass es für die Werte nach dem Fragezeichen die Variable $_GET gibt, haben wir Einfachheit halber ignoriert. $_GET speichert die Werte in einen Array. Diese Variable zählt zu den Superglobals und muss wie $_SERVER['REQUEST_URI'] zur Sicherheit gefiltert werden, siehe EGPCS-Variablen waschen und desinfizieren.

Steht in einer Url z.B. ‚index.php?seite=seitenname‚ dann ist der Index (Schlüsselwert) ’seite‘ und der Wert der Variable $_GET['seite']seitenname‚. Mehr dazu in der nächsten Lektion in der es noch einmal um die foreach-Schleife und neu dazu kommt die for-Schleife und do-while und der switch.

Jetzt erst einmal viel Spass beim Erstellen der ersten PHP-Baustein-Webseite.

Leave a Reply