Arbeiten mit s Eine effiziente Programmierung mit PHP ohne seine s ist kaum vorstellbar. Diese Datenstruktur muss man verstanden haben, sonst brauchen wir mit weitergehenden Programmiertechniken wie der OOP gar nicht erst anzufangen. 4.1 Eigenschaften 4.1.1 Schlüssel und Element s in PHP muss man verstanden haben. Ihre recht uneingeschränkte Anwendung erlaubt ein sehr effizientes Programmieren. In anderen Programmiersprachen werden eindimensionale Felder, mehrdimensionale Felder, numerisch indizierte s, Hashtabellen usw. unterschieden. Alle diese Konstruktionen werden in PHP vom Typ array abgedeckt. Dabei liegt es in der Verantwortung des Programmierers, sich für eine bestimmte zweckgebundene Struktur zu entscheiden. Ein PHP- besitzt folgende Eigenschaften: Ein enthält keins, eins oder mehrere Elemente. Jedes Element hat immer einen Schlüssel Key, Index und einen Wert Value. Der Schlüssel ist eine ganze Zahl int oder ein Name string. Der Wert kann wie bei einer Variablen beliebigen Typs sein. Nach der Theorie hilft nur die Praxis weiter. $obst = array'apfel', 'Birne', 'Pflaume'; print_r$obst; [0] => Apfel 57
Arbeiten mit s [1] => Birne [2] => Pflaume Listing 4.1: Beispiel array1.php Die Funktion array erzeugt ein. Im Beispiel sind drei Elemente enthalten mit den Zeichenkettenwerten 'Apfel', 'Birne' und 'Pflaume'. Die Schlüssel sind numerisch und werden automatisch erzeugt, beginnend mit dem Wert 0. Im nächsten Beispiel wird dasselbe erzeugt, aber mit expliziter Angabe der Schlüssel. Der Operator => verbindet einen Schlüssel mit seinem Wert. $obst = array0 => 'Apfel', 1 => 'Birne', 2 => 'Pflaume'; print_r$obst; Listing 4.2: Beispiel array2.php Das folgende, numerisch indizierte scheint»lücken«zu haben. Besser gesagt: Es ist dem egal, ob die Schlüssel eine lückenlose numerische Folge darstellen oder nicht. Es muss nicht mal eine Folge sein. $obst = array0 => 'Apfel', 7 => 'Birne', 293 => 'Pflaume'; print_r$obst; [0] => Apfel [7] => Birne [293] => Pflaume Listing 4.3: Beispiel array3.php Ebenso ist es dem egal, ob seine Schlüssel numerisch sind oder Namen haben. Wichtig Schlüssel-Namen immer korrekt als Zeichenketten-Literal schreiben; also in Quotes setzen. Andernfalls besteht Verwechslungsgefahr mit Konstanten. 58
4.1 Eigenschaften $obst = array'zuerst' => 'Apfel', 'dann' => 'Birne', 'zuletzt' => 'Pflaume'; print_r$obst; [zuerst] => Apfel [dann] => Birne [zuletzt] => Pflaume Listing 4.4: Beispiel array4.php Da die Art der Indizierung egal ist, ist auch eine Mischung erlaubt. Was sein darf, heißt noch lange nicht, dass man es auch so machen muss. In den meisten Fällen wird nur eine bestimmte Art der Indizierung sinnvoll sein. $obst = array0 => 'Apfel', 'dann' => 'Birne', 5 => 'Pflaume'; print_r$obst; [0] => Apfel [dann] => Birne [5] => Pflaume Listing 4.5: Beispiel array5.php Ein mehrdimensionales entsteht, wenn man einem -Element ein anderes zuweist. Auch hier darf die Indizierung beliebig sein. Hinweis Es gibt verschiedene Funktionen, die mit s arbeiten. Einige davon erwarten numerisch indizierte s mit lückenloser Nummerierung ab dem Wert Null. Es immer richtig, im Handbuch nachzuschauen, welche Anforderungen eine bestimmte Funktion von einem erwartet. 59
Arbeiten mit s Zusammenfassend können wir s als Kollektion von Elementen verstehen, die durch Schlüssel Key, ganzzahlig oder Zeichenkette, indiziert sind und einen Wert Value beliebigen Typs haben dürfen. Außer, dass sie unikat sein müssen, gibt es keine weiteren Einschränkungen in der Wahl der Schlüssel. Bezüglich Größe und Typ des Wertes verhält sich ein -Element nicht anders als eine reguläre PHP-Variable. 4.1.2 -Elemente ansprechen Gibt man den Schlüssel eines -Elements in eckigen Klammern hinter dem -Namen an, wird das betreffende -Element angesprochen. Diese Index- Schreibweise ist in den meisten bekannten Programmiersprachen üblich. Das folgende Beispiel ist daher wahrscheinlich sofort verständlich. # s erzeugen $myay1 = array'apfel', 'Birne', 'Pflaume'; $myay2 = array'name' => 'Beispiel', 'vorname' => 'Knut'; # -Elemente lesen print 'Das zweite Element von $myay1: '.$myay1[1]."\n"; print 'Das zweite Element von $myay2: '.$myay2['vorname']."\n"; # -Elemente beschreiben $myay1[0] = 'Erdbeere'; $myay2['name'].= '-Hohenfeld'; # s komplett ausgeben print_r$myay1; print_r$myay2; [0] => Erdbeere [1] => Birne [2] => Pflaume [name] => Beispiel-Hohenfeld [vorname] => Knut Listing 4.6: Beispiel array6.php 60
4.1 Eigenschaften Das Beschreiben eines nicht vorhandenen -Elements lässt PHP automatisch das passende erzeugen. # $ay1, $ay2 und $ay3 gibt es noch nicht $ay1[4] = 'Hallo'; $ay2[] = 'Welt'; $ay3[2][7] = 'geht doch'; # Aber danach: print_r$ay1; print_r$ay2; print_r$ay3; [4] => Hallo [0] => Welt [2] => [7] => geht doch Listing 4.7: Beispiel array7.php Die implizit erstellten s enthalten genau die im Programmcode benannten Elemente und keine weiteren. Wird wie bei $ay2[] kein Schlüssel angegeben, so wird numerische Indexierung angenommen. Existiert das noch nicht wie im Beispiel, beginnt die Zählung erwartungsgemäß bei 0. Existiert das bereits, wird ein Element mit dem nächsten numerischen Schlüssel hinzugefügt. Ein mehrdimensionales im Sinne von Indexierung und Unter-Indexierung würde Elemente nach dem Muster $ay[2,7] enthalten. Das gibt es in PHP nicht. 61
Arbeiten mit s Das $ay3 im Beispiel ist in gewisser Weise mehrdimensional. Allerdings so, dass das -Element $ay3[2] selbst ein ist, welches das Element $ay3[2][7] enthält. Eine Mehrdimensionalität lässt sich also mit s und Unter-s verwirklichen. Auch hier gibt es keine Grenze, sodass auf diese Weise auch Baumstrukturen realisierbar sind. 4.1.3 Einige -Funktionen Möchte man einem numerisch indizierten Elemente in einer Schleife hinzufügen, dann kann die Funktion array_push günstig eingesetzt werden. $anzahl = array_push$my, $mywert; Listing 4.8: Aufrufbeispiel der Funktion array_push Die Funktion erwartet im ersten Argument das und danach einen oder mehrere Werte. Jeder Wert wird als neues -Element eingetragen und erhält automatisch den nächsten numerischen Schlüssel. Nach dem Hinzufügen der neuen Elemente wird die aktuelle Anzahl der -Elemente zurückgegeben. asort$my, Flag; Listing 4.9: Aufrufschema der Funktion asort Die Sortierfunktion asort behandelt ein als assoziatives und zerstört nicht die Verbindung zwischen Schlüssel und Wert. Im Listing 4.9 ist Flag symbolisch gemeint. Als Flag werden Konstanten notiert, die die Sortierung der -Elemente nach ihrem Wert beeinflussen. Die Konstante SORT_NUMERIC beispielsweise sortiert numerisch, SORT_STRING dagegen fasst die Werte als Zeichenketten auf. $part = pathinfo'/opt/lampp/htdocs/bild.png' # $part['dirname'] enthält '/opt/lampp/htdocs' # $part['basename'] enthält 'bild' # $part['extension'] enthält 'png' Listing 4.10: Aufrufbeispiel der Funktion pathinfo Recht viele Informationen lassen sich in ein überführen. So ist das Zerlegen eines Pfadnamens in seine Bestandteile ein häufig wiederkehrendes Problem. Die Funktion pathinfo erzeugt ein, in dem sich die Bestandteile des angegebenen Pfadnamens in Elementen mit festgelegten Schlüsselnamen wiederfinden. Die Kommentare im Listing 4.10 zeigen das Ergebnis für das Aufrufbeispiel. 62
4.2 s in andere Strukturen konvertieren 4.2 s in andere Strukturen konvertieren 4.2.1 s und Variablen Möchte man Variablenwerte in ein übertragen, ist das überhaupt kein Problem. $f1 = 'Apfel'; $f2 = 'Birne'; $f3 = 'Pflaume'; $ay = array$f1, $f2, $f3; print_r$ay; [0] => Apfel [1] => Birne [2] => Pflaume Listing 4.11: Beispiel array8.php Hier wurde ein explizit erstellt und die Variablen $f1 bis $f3 lieferten die Werte. Völlig anders geht die Funktion compact vor. $obst = 'Apfel'; $ist = 'Birne'; $gesund = 'Pflaume'; $ay = compact'obst', 'ist', 'gesund'; print_r$ay; [obst] => Apfel [ist] => Birne [gesund] => Pflaume Listing 4.12: Beispiel array9.php 63
Arbeiten mit s Die Funktion compact erwartet Variablennamen als Zeichenketten und erstellt ein Namen-indexiertes. Das Umgekehrte ist auch möglich, und zwar mit der Funktion extract. Nach Ausführung der Funktion existieren Variablen, deren Namen den Element-Schlüsseln und deren Werte den Element-Werten des angegebenen s entsprechen. $ay = array'f1' => 'Apfel', 'f2' => 'Birne', 'f3' => 'Pflaume'; print "Variablen: $f1, $f2, $f3\n"; extract$ay; print "Variablen: $f1, $f2, $f3\n"; Variablen:,, Variablen: Apfel, Birne, Pflaume Listing 4.13: Beispiel array10.php Das war noch nicht alles. Eventuell möchten Sie Werte eines s in vorhandene Variablen übertragen beziehungsweise die Variablennamen selbst festlegen. $ay = array'apfel','birne','pflaume'; $a = 'Aha'; list$a, $b, $c = $ay; print "Variablen: $a, $b, $c\n"; Variablen: Apfel, Birne, Pflaume Listing 4.14: Beispiel array11.php Mithilfe von list erhalten die als Argument verwendeten Variablen die - Werte nacheinander zugewiesen. Die Funktion überschreibt bereits vorhandene Variablen im Beispiel $a und legt nicht vorhandene an im Beispiel $b, $c. Bei list gibt es Einschränkungen. Es können nur Werte von s bezogen werden, die numerisch indexiert sind. Die Wert-Übernahme beginnt beim Element mit dem Schlüsselwert 0 und geht weiter in direkt aufsteigender Folge. Wäre das Element $ay[1] nicht vorhanden, würde die Variable $b im Beispiel keinen Wert aus dem bekommen. 64
4.2 s in andere Strukturen konvertieren 4.2.2 s und Zeichenketten Eine große Hilfe sind s bei der Bearbeitung von Texten. Wir demonstrieren das anhand des folgenden Beispieltextes, der in der Datei beispieltext.txt festgehalten ist. Das ist ein mehrzeiliger Beispieltext, der einfach nur den Zweck hat, ein Text zu sein. Listing 4.15: Datei beispieltext.txt Als Erstes könnten wir versuchen, diesen Text in einzelne Zeilen zu fassen. Die Funktion file_get_contents holt den Text aus der Datei und schreibt ihn unverändert in eine Variable. Danach hilft explode weiter. Und wie man erkennt, ist diese Erklärung länger als der Programmcode. $text = file_get_contents'beispieltext.txt'; $ay = explode"\n", $text; print_r$ay; [0] => Das ist ein [1] => mehrzeiliger Beispieltext, [2] => der einfach nur den Zweck hat, [3] => ein Text zu sein. [4] => Listing 4.16: Beispiel array12.php Die Funktion zerlegt die Zeichenkette anhand des Trennzeichens im ersten Argument. Als Trennzeichen wurde Zeilenwechsel angegeben, und so ergibt sich eine zeilenweise Teilung. Ebenso könnte man den Punkt als Trennzeichen angeben und den Text so in Sätze teilen. Der folgende Programmcode teilt die dritte Zeile in einzelne Wörter durch Angabe des Leerzeichens als Trennzeichen. # dritte Zeile zerlegen: $line_ay = explode' ', $ay[2]; print_r$line_ay; 65
Arbeiten mit s [0] => der [1] => einfach [2] => nur [3] => den [4] => Zweck [5] => hat, Listing 4.17: Weiter im Beispiel array12.php Natürlich kann man umgekehrt auch den Inhalt eines s in Text verwandeln. Die Funktion, die das bewirkt, heißt treffend implode. $myay1 = array'apfel', 'Birne', 'Pflaume'; $myay2 = array'vorname' => 'Knut', 'name' => 'Beispiel'; $text = implode' ', $myay2.' isst gern dieses Obst: '.implode',',$myay1; print $text."\n"; Knut Beispiel isst gern dieses Obst: Apfel,Birne,Pflaume Listing 4.18: Beispiel array13.php Die Funktion wurde zweimal angewandt, einmal mit dem Leerzeichen andermal mit Komma als Trennzeichen. Und falls wir diesen Text in einer Datei speichern möchten, bietet file_put_contents die einfachste Lösung. 66