PHP lernen (2): Grundlagen der Syntax
Arrays
Arrays
Auf dieser Seite
Mit Bild
In Teil 1 haben wir über Datentypen gesprochen. Dabei wurden Arrays kurz angesprochen, aber nicht weiter erläutert. Wir beschäftigen uns hier ausgiebig mit Arrays, wie man sie definiert und auf die Elemente zugreift. Wenn Sie später mit Schleifen arbeiten, können Sie Arrays auch bequem in Schleifen verarbeiten.
Mit Bild
Es gibt indizierte Arrays mit einem automatischen Index und assoziative Arrays mit einem selbst benannten Schlüssel. Arrays können beliebig viele Dimensionen haben, dazu unten mehr.
Mit Bild
Mit Bild
Indizierte Arrays
Arrays sind Listen von Werten, sozusagen mehrere einzelne Variablen. Sie werden wie Variablen durch das Dollarzeichen $ bezeichnet und verfügen zusätzlich über einen Index, der mit eckigen Klammern [] angesprochen wird.
Mit Bild
Eine einfache Liste wie "Apfel, Birne, Banane usw." bildet ein skalares oder indiziertes Array. Eine solche Liste verfügt automatisch über einen Index. Das erste Element eines solchen Arrays hat den Index 0. Sie können einem Array Werte zuweisen, indem Sie jeden einzelnen Wert bestimmen:
Mit Bild
$obst[0] = "Apfel"; $obst[1] = "Birne";
Mit Bild
Wenn Sie den Index weglassen, werden die weiteren Elemente hinten angehängt:
Mit Bild
$obst[] = "Banane"; // $obst[2] ist "Banane" $obst[] = "Mango"; // $obst[3] ist "Mango"
Mit Bild
Sie können auch mit der Funktion array() mehrere Werte zugleich zuweisen:
Mit Bild
$gemuese = array("Tomate", "Gurke", "Paprika", "Zucchini"); $gemuese[] = "Aubergine"; // $gemuese[4] ist Aubergine print "Das dritte Gemüse ist eine " . $gemuese[3]; print "<br/>"; print "Das vierte Gemüse ist eine " . $gemuese[4]; /* Dieses Beispiel erzeugt die Ausgabe: Das dritte Gemüse ist eine Zucchini Das vierte Gemüse ist eine Aubergine */
Mit Bild
Beachten Sie, dass der Index immer mit 0 und nicht mit 1 beginnt!
Sie können dieses Array übrigens auch sortieren. Beschreibungen von Array-Funktionen finden Sie wie üblich im Handbuch. Benutzen Sie dafür sort() bzw. rsort().
Um sich über alle Elemente in einem Array klar zu werden, kann man sie bequem zum Testen mit print_r() ausgeben. Das sieht im Browser manchmal etwas wild aus, in diesem Fall gehen Sie einfach in die Quelltextansicht, hier ist es übersichtlicher. Anhand dieser Ausgabe können Sie schnell überprüfen, was die beiden Funktionen ausgelöst haben:
Mit Bild
print_r($gemuese); sort($gemuese); print_r($gemuese); rsort($gemuese); print_r($gemuese);
Mit Bild
Die erste Ausgabe zeigt die Elemente in der Reihenfolge, in der sie zugeordnet wurden. Die zweite Ausgabe zeigt sie in alphabetischer, die dritte Ausgabe in umgekehrt alphabetischer Reihenfolge.
Wenn Sie sich den Umweg über die Quelltextansicht im Browser sparen wollen, können Sie um das Sprachkonstrukt print_r() herum die HTML-Tags <pre></pre> für vorformatierten Text setzen. Dann wird der aktuelle Inhalt des Arrays so ausgegeben, wie er auch im Quellcode steht.
Mit Bild
print '<pre>'; print_r($gemuese); print '</pre>'; sort($gemuese); print '<pre>'; print_r($gemuese); print '</pre>'; rsort($gemuese); print '<pre>'; print_r($gemuese); print '</pre>';
Mit Bild
Assoziative Arrays
Einen Index können Sie auch selbst benennen, dann bilden Sie sogenannte Schlüssel-Wert-Paare. Ist der Index vom Typ string, muss er in Anführungszeichen stehen. Wenn Sie die Funktion array() benutzen, brauchen Sie den Zuweisungsoperator =>:
Mit Bild
$mitglied[256] = 'Michael Meier'; $kunde['name'] = 'Michael Meier';
Mit Bild
Im ersten Beispiel ist 256 der Schlüssel und Michael Meier der Wert dieses Array-Elements. Sie können den numerischen Schlüssel also selbst bestimmen.
Im zweiten Beispiel ist name der Schlüssel und der Wert wiederum Michael Meier. Durch den benannten Schlüssel wird das Array ein assoziatives. Das letzte Beispiel $kunde legt schon die Erweiterung nahe. Ein Array kann auch mehr als einen Schlüssel haben, dann handelt es sich um ein mehrdimensionales Array.
Mit Bild
Mehrdimensionale Arrays
Stellen Sie sich mehrdimensionale Arrays als Tabelle vor. Die Spaltenbenennung ist der Schlüssel. Der numerische Index ist automatisch enthalten, auch wenn Sie ihn nicht explizit bezeichnen. Der Vollständigkeit halber ist er als Spalte in die Tabelle eingefügt. Wir kümmern uns aber nicht ausdrücklich darum.
Spannend werden assoziative Arrays, wenn sie mehr als eine Dimension haben. Je mehr Dimensionen dazukommen, desto mehr Spalten kommen zur Tabelle hinzu:
(Index) |
Name |
Farbe |
Form |
0 |
Tomate |
rot |
rund |
1 |
Karotte |
orange |
länglich |
2 |
Gurke |
grün |
länglich |
3 |
Aubergine |
lila |
oval |
Kommen wir nun dazu, wie ein solches Array definiert wird. Auch bei mehrdimensionalen Arrays gibt es wieder mehrere Möglichkeiten der Zuweisung. Schauen wir uns zunächst noch einmal die eindimensionale, assoziative Variante an:
Mit Bild
$gemuese = array ('name' => 'Tomate', 'farbe' => 'rot', 'form' => 'rund'); // oder: $gemuese['name'] = 'Karotte'; $gemuese['farbe'] = 'orange'; $gemuese['form'] = 'länglich'; print 'Eine '.$gemuese['name'].' hat die Farbe ' . $gemuese['farbe']; // oder auch: print "Eine ".$gemuese["name"]." hat die Farbe " . $gemuese["farbe"]; // Ausgabe: Eine Karotte hat die Farbe orange
Mit Bild
Diese Schreibweise erzeugt nur eine Dimension. Das Element mit Namen Tomate wird durch das Element mit Namen Karotte überschrieben. Benutzen Sie wieder print_r(), um sich über den Zustand des Arrays klar zu werden. Diese Ansicht zeigt uns für unser Array zurzeit Folgendes an:
Mit Bild
print '<pre>'; print_r($gemuese); print '</pre>'; /* erzeugt folgende Ausgabe: Array ( [name] => Karotte [farbe] => orange [form] => länglich ) */
Mit Bild
Um die zusätzliche Dimension zu erzeugen, machen wir uns noch einmal bewusst, dass es einen numerischen Index gibt. Sprechen wir den erst einmal gezielt an. In der zweiten Zuweisung wird er durch leere eckige Klammern repräsentiert. Das Beispiel funktioniert analog zu dem eindimensionalen Array $gemuese oben.
Mit Bild
$gemuese = array (0 => array("name" => "Tomate", "farbe" => "rot", "form" => "rund"), 1 => array("name" => "Karotte", "farbe" => "orange", "form" => "länglich")); $gemuese[] = array("name" => "Gurke", "farbe" => "grün", "form" => "länglich"); print '<pre>'; print_r($gemuese); print '</pre>'; /* erzeugt folgende Ausgabe: Array ( [0] => Array ( [name] => Tomate [farbe] => rot [form] => rund ) [1] => Array ( [name] => Karotte [farbe] => orange [form] => länglich ) [2] => Array ( [name] => Gurke [farbe] => grün [form] => länglich ) ) */ print "Eine ".$gemuese[1]["name"]." hat die Farbe " . $gemuese[1]["farbe"]; // Ausgabe: Eine Karotte hat die Farbe orange
Mit Bild
Dieses Beispiel weist zunächst die Elemente Tomate und Karotte mithilfe der array()-Funktion einem neuen Array $gemuese zu. Dabei bedienen Sie sich des numerischen Indexes. Dem Index 0 werden die Eigenschaften der Tomate zugeordnet, dem Index 1 die Eigenschaften der Karotte. Die Gurke und ihre Eigenschaften werden dem nun vorhandenen Array zugeordnet, indem mit $gemuese[] ein neues Element initiiert wird und mit der array()-Funktion in dieses Element ein weiteres Array mit den Eigenschaften der Gurke geschrieben wird.
Soweit so gut. Nun macht es vielleicht aber hier mehr Sinn, statt eines numerischen Indexes für das äußere Array, also dessen erste Dimension, den Namen unseres Gemüses zu verwenden:
Mit Bild
$gemuese = array("Karotte" => array("Farbe" => "orange", "Form" => "lang" ), "Tomate" => array("Farbe" => "rot", "Form" => "rund" ), "Gurke" => array("Farbe" => "gruen", "Form" => "lang") ); $gemuese["Aubergine"]["Farbe"] = "lila"; $gemuese["Aubergine"]["Form"] = "lang";
Mit Bild
Die Schreibweise hat es in sich, ist aber wirklich die übersichtlichste. Sie fügen dem Array zunächst das Element Karotte hinzu. Karotte ist zugleich der Schlüssel für ein Array im Array. Um Elemente eines mehrdimensionalen Arrays anzusprechen, bedienen Sie sich zweier Indizes:
Mit Bild
print "Eine Karotte hat die Farbe " . $gemuese["Karotte"]["Farbe"]; // Ausgabe: Eine Karotte hat die Farbe orange
Mit Bild
Zunächst wird mit dem Schlüssel Karotte ein bestimmtes Array im Array ausgewählt, sozusagen eine bestimmte Liste. Mit dem zweiten Schlüssel wird nun das genaue Element dieses Arrays bzw. der Liste Karotte angesprochen.
Der Name des Gemüses ist nun der Schlüssel der ersten Dimension. Damit wird interessant, wie man auf diesen Schlüssel zugreifen kann. PHP hält auch für Arrays eine Reihe von eigenen Funktionen bereit. Für die PHP-eigenen Array-Funktionen gibt es ein eigenes Kapitel im Handbuch auf der Website php.net.
Der Name des Schlüssels wird über die Array-Funktion key() ermittelt. Es wird dabei der Schlüssel zurückgegeben, auf deren Element der interne Zeiger des Arrays gerade steht.
Mit Bild
print key($gemuese); // gibt Karotte aus print "Eine ". key($gemuese)." hat die Farbe " . $gemuese[key($gemuese)]["farbe"]; // Ausgabe: Eine Karotte hat die Farbe orange
Mit Bild
Die Funktion key() gibt den aktuellen Schlüssel zurück. Um alle Schlüssel unseres Arrays zu ermitteln, benutzen Sie zusätzlich die Array-Funktionen reset() und next():
Mit Bild
reset($gemuese); // setze internen Zeiger auf das 1. Element print key($gemuese); // gibt Karotte aus next($gemuese); // setze internen Zeiger auf das nächste Element print key($gemuese); // gibt Tomate aus next($gemuese); // setze internen Zeiger auf das nächste Element print key($gemuese); // gibt Gurke aus
Mit Bild
Sie merken natürlich sofort, dass das so nicht wirklich funktioniert, weil es viel zu viel Schreibarbeit mit sich zieht und viel zu unflexibel ist. Kommt ein Schlüssel dazu, müssen Sie den Code verändern. Wollen Sie alle Elemente eines Arrays mit den dazugehörigen Schlüsseln ausgeben, verwenden Sie eine Schleife. Darauf kommen wir im Abschnitt "Schleifen" bei den foreach-Schleifen noch einmal zurück. Merken Sie sich hier zunächst nur, dass es einen internen Zeiger im Array gibt und alle Aktionen, die Sie an Elementen eines Arrays ausüben, über diesen Zeiger steuern.
Zu den wichtigsten Array-Funktionen gehört noch die Funktion count(), mit der Sie die Anzahl der Elemente eines Arrays ermitteln können:
Mit Bild
print count($gemuese); // gibt 3 aus
Mit Bild
In diesem letzten Array ist es auch interessant, nach den Schlüsseln zu sortieren:
Mit Bild
print_r($gemuese); ksort($gemuese); // alphabetisch nach Schlüsseln print_r($gemuese); krsort($gemuese); // umgekehrt alphabetisch nach Schlüsseln print_r($gemuese);
Mit Bild
Das Verständnis von mehrdimensionalen Arrays ist später für die Datenbankabfragen wichtig. Die Ergebnisse der Abfragen werden in Arrays gespeichert. Sie müssen auf diese Arrays zugreifen, um mit den einzelnen Datensätzen zu arbeiten.