PHP lernen – Arrays

Hi,

heute geht’s um Arrays. Du hast Variablen kennen gelernt und weißt, dass man in solchen Werte speichern kann. Und dass Variablen von verschiedenen Typen sein können (Text, Zahlen, Wahrheitswert). Arrays sind sowas ähnliches – sie tun im Grunde dasselbe, es lassen sich darin aber mehr als nur ein Wert abspeichern.

Was sind Arrays?

Arrays sind sog. Datenfelder, man spricht auch von Schlüssel-Werte-Paaren. Variablen kennst du ja schon. Eine Variable  hat einen Namen und ihr wird ein Wert zugewiesen. Einem Array können hingegen viele Werte zugewiesen werden. Dabei legt man einen Wert im Array ab, auf den man über einen Schlüssel Zugriff erhält. Dieser Schlüssel ist quasi der Index innerhalb der Liste von Werten. Schlüssel klingt kompliziert, im Grunde werden die Werte abgelegt und der Index automatisch durchnummeriert wenn man selbst keinen angibt.

Arrays werden in eckigen Klammern deklariert, kommagetrennt werden die einzelnen Werte übergeben, zum Beispiel [ "Apfel", "Birne", "Banane" ].
Du kannst auch ein leeres Array das keine Werte hat und vielleicht erst später welche bekommt deklarieren, dann einfach mit einer öffnenden und schließenden eckigen Klammer ohne Werte darin, also [].

Zur Deklaration schreibst du dann einfach $meinArray = [ "Wert1", "Wert2" ]; Der Index („Schlüssel“) wird automatisch vergeben sodass das erste Element im Array an Index #0 liegt und das zweite an Index #1 und so weiter. In der Programmierung wird bei 0 angefangen zu zählen, nicht bei 1.

Testen wir das in der Praxis. Ich deklariere ein Array und gebe ihm 3 Werte, anschließend gebe ich den ersten und zweiten Wert aus:

Analog hierzu können wir nun auch noch das dritte und letzte Element ausgeben – du ahnst schon wie wir Zugriff darauf erhalten:

Fantastisch, ich denke das ist nicht so schwer – abgesehen davon dass es natürlich etwas wirr aussieht, wenn man vorher noch nie Programmcode gesehen hat 😉

Es gibt noch eine andere, veraltete Schreibweise zur Deklaration von Arrays:

Warum zeig‘ ich dir das, will ich Verwirrung stiften? Nein, allerdings wirst du beim googlen vermutlich über beide Schreibweisen stolpern, besser du hast sie also gleich intus. Diese Schreibweise mit den eckigen Klammern ist durchweg zu empfehlen, nicht nur weil es intuitiver ist (den Zugriff auf Elemente des Array erhältst du ja auch, indem du den Schlüssel in eckigen Klammern angibst) sondern auch weil sie geläufiger ist. Möglich ist das ab PHP Version 5.4, aber da solltest du mit dem aktuellen XAMPP-Paket definitiv drüber liegen (PHP 5.6, sicherlich aber schon irgendwas über PHP 7). Falls du doch Bedenken hast, kannst du das mit folgender Code-Zeile ganz schnell herausfinden:

Numerische Indexierung

Wie du siehst, hat PHP also die Werte die zu in das Array gepackt hast, automatisch durchnummeriert – weniger zu tun für uns. Aber natürlich können wir aber auch selbst angeben, welcher Wert unter welchem Schlüssel gespeichert wird.

Es ist also völlig egal, unter welchem Index du deine Werte speichern willst. Entsprechend erfolgt der Zugriff nun über die von dir angegebenen Schlüssel:

Die Ausgabe ist ein bisschen ätzend: ApfelBananeMelone . Das kriegen wir schöner hin, indem wir einfach einen HTML-Zeilenumbruch hinter jede ausgegebene Zeile setzen:

Und schon sieht es hübsch aus:

Manuelle und automatische Indexierung mischen

Du hast jetzt gesehen wie PHP die Nummerierung selbst vornimmt und wie du sie beeinflussen kannst. Bei der Deklaration können wir beide Varianten ganz einfach mischen. PHP arbeitet dabei so, dass es versucht, mit dem nächsthöheren, verfügbaren Zahlenwert zu nummerieren. Sehen wir uns das mal an:

Und damit wir nicht wieder so viele Zeilen zur Ausgabe verschwenden müssen, gibt es zwei einfache Befehle, um Arrays auf die schnelle auszugeben, var_dump  und print_r . Also dasselbe nochmal:

Die Ausgabe sieht folgendermaßen aus:

So schnell kann’s gehen – aber so richtig schön ist es nicht. Ich persönlich verwende zur Ausgabe immer gern den HTML pre -Tag in Verbindung mit print_r, wobei ich an die print_r Funktion noch zusätzlich den zweiten Parameter true übergebe, der dafür sorgt, dass print_r nicht sofort eine Ausgabe macht – damit kann ich print_r mit echo verwenden. Machen wir’s diesmal richtig:

Und die Ausgabe ist auch sehr hübsch und übersichtlich:

Für Banane und und Birne hat PHP den Index selbst bestimmt. Die Banane an Index 13 (weil der größte vorherige 12 ist, das haben wir selber so festgelegt) und die Birne an 14, weil es die nächstgrößere verfügbare Zahl ist.

Welche Fallstricke gibt es?

Man kann sich schonmal vertippen und zum Beispiel einen Wert aus dem Array holen, den es am angegebenen Index nicht gibt. Machen wir mal absichtlich einen Fehler:

So, und wenn du den Code jetzt ausführst, bekommst du entweder gar nix angezeigt (die Seite bleibt weiß und hat keine Ausgabe) oder du bekommst eine Fehlermeldung.

Fehlerausgabe aktivieren

Falls du nur eine weiße Seite bekommst, erweitere deinen Code am Anfang um die folgenden zwei Zeilen:

Vermutlich bekommst du also spätestens jetzt den Fehler ausgegeben:

Perfekt, ein Fehler, was machen wir jetzt damit? Nix, aber du hast eine neue Fehlermeldung kennengelernt. „Undefined offset“ bedeutet übersetzt in etwa soviel wie dass der Ableger nicht definiert ist. Der Wert der versucht wurde auszugeben, ist also nicht bei Index 7 abgelegt. Den Fehler wirst du am Anfang noch öfter machen, spätestens wenn du mit Formularen und Schleifen arbeitest.

Kann ich Werte auch nachträglich zum Array hinzufügen?

Sicher, nix leichter als das. Und zwar einfach, indem wir an den Variablennamen des Arrays ein Paar eckiger Klammern hängen und dann den Wert zuweisen. Außerdem siehst du, wie man ein leeres Array anlegen kann (jupp, das geht natürlich auch):

Die Ausgabe hierzu ist dementsprechend:

Und natürlich lassen sich vorhandene Werte in einem Array auch genausogut Überschreiben. Check das:

Der Wert an Index 2 (Banane) wurde also ersetzt mit Erdbeere, daher auch die Ausgabe:

Assoziativer Index – Namen statt Zahlen

Wie schon gesagt, ein Element, also ein Wert im Array erhält automatisch einen Index, wenn man selber keinen angegeben hat. Über diesen Index  kann ein Array-Element angesprochen werden. Es gibt 2 Arten, wie Werte in Arrays indexiert werden können:

  • Numerischer Index
    Wenn man die Werte einfach an ein Array übergibt, nummeriert PHP den Index von 0 (Null) beginnend einfach durch. Das erste Element („Wert1“) ist an Index #0 des Arrays zu finden, „Wert2“ ist an Index #1 und so weiter. Du kannst den numerischen Index auch selbst festlegen. Beide Möglichkeiten habe ich dir oben gezeigt.
  • Assoziativer Index
    So viele seltsame Begriffe auf einmal! Aber wir schaffen das schon, keine Panik. Assoziativ heißt nur, dass man Elemente eines Arrays nicht durch einen numerischen Index sondern stattdessen über einen Namen speichert und anspricht. Das ist wesentlich komfortabler wenn man im Vornherein weiß, welche Werte das Array enthält.

Funktionieren tut es genauso, nur dass man anstatt Zahlen eben Text für den Index angibt (somit also in Anführungszeichen). Und so läuft es:

Das Beispiel erzeugt folgende Ausgabe:

Ist doch deutlich komfortabler und auch intuitiver, als sich einen numerischen Index zu merken 🙂

Kann ich Elemente in einem Array numerisch UND assoziativ ablegen?

Auch das geht, wie folgendes Beispiel zeigt:

Das Beispiel erzeugt folgende Ausgabe:

Wir haben dem Array zuerst über einen assoziativen Index „eins“ den Wert „Wert 1“ zugewiesen, dann über einen numerischen Index den Wert „Wert 2“ und zum Schluss wieder PHP überlassen, an welchem Index er den dritten Wert „Wert 3“ ablegt – in dem Fall an Index #9, weil ja #8 vorher der höchste numerische Index war.

Ein Array kann also numerisch oder assoziativ oder von PHP automatisch indexiert werden – und das geht wenn wenn man will auch alles zugleich.

Kann der Wert eines Arrays selbst ein Array sein?

Klar, auch das ist möglich. Man spricht dabei von „verschachtelten“ Arrays (nested arrays). Ein Array kann also beliebig viele weitere Arrays als Werte haben, und auch die können wiederum weitere Arrays enthalten. Geschrieben wird es genauso. Hier ein Code zur Verdeutlichung:

Das Beispiel erzeugt folgende Ausgabe:

Array-Funktionen

PHP stellt einige Funktionen speziell für Arrays zur Verfügung. Ich zeige dir im Folgenden einige davon.

Werte aus einem Array löschen

Aus einem Array können mit der Funktion unset  Werte gelöscht werden. Schau her:

Die Ausgabe hierzu lautet dementsprechend:

Etwas hieran fällt ins Auge – das Array wird nicht neu indiziert. Der Wert wird einfach rausgelöscht. Wenn man an unset ein Array ohne Angabe des Index übergibt, ist anschließend das Array weg. Analog hierzu kann man an die Funktion unset anstatt eines Array-Wertes auch eine Variable übergeben – diese würde es anschließend einfach nicht mehr geben. Lass mich dir auch das kurz zeigen:

Die Ausgabe hierzu? Schwer zu sagen, entweder bei dir wird gar nichts angezeigt (weiße Seite) oder du erhältst folgende Fehlermeldungen:

Die Beschreibung des Fehlers ist recht eindeutig: „Undefined Variable“. Es wird also versucht, eine Variable (in dem Fall ja zuerst ein Array und danach eine Variable, PHP macht da von der Fehlermeldung her aber keinen Unterschied) auszugeben, die nicht deklariert ist. Warum nicht? Weil wir sie mit unset gelöscht haben.

Anzahl der Array-Elemente anzeigen

Hierfür gibt’s eine Funktion count . Man übergibt ihr das Array und sie spuckt aus, wieviele Werte es enthält:

Die Ausgabe ist

Werte im Array zufällig anordnen

Die Funktion shuffle  tut genau das:

Folgende Ausgabe wird erzeugt (die natürlich jedes mal anders ist):

Implode und Explode

Klingt erstmal seltsam, aber diese beiden Funktionen wirst du lieben – und später sicher auch an einigen Stellen verwenden.

implode

Mit implode kannst du alle Elemente eines Arrays zu einem String zusammenfügen. Die Funktion erwartet zwei Werte die zu übergeben sind, 1) einen Verkettungs-String und 2) das Array mit den Werten. Schau selbst:

Du siehst folgende Ausgabe:

Alle Elemente des Arrays wurden mit zusammengefügt. Du kannst das natürlich dann auch einer Variable zuweisen, einfach mit $Text = implode(", ", $Namen); .

explode

Explode tut genau das Gegenteil – es splittet einen String anhand eines bestimmten gewünschten Zeichens in Array-Elemente. Check das:

Wir splitten den Text auf bei allen Leerzeichen, anschließend geben wir das Array mit print_r aus und sehen:

Die beiden Funktionen werden dir oft nützlich sein.

Funktion range()

Die Funktion range() kann dir automatisch ein Array mit Zahlen befüllen, sie erwartet 2 Pflichtargumente für kleinste und größte Zahl, optional kann als dritter Parameter die Schrittweise übergeben werden.

Der folgende Code füllt ein Array mit Zahlen von 8 bis 25 (jeweils einschließlich):

Das Ergebnis sieht folgendermaßen aus:

Praktisch wenn’s schnell gehen soll und man schon weiß was man im Array haben will. Und wenn wir jetzt den Code etwas verändern und eine Schrittweite von 5 einstellen:

dann erhalten wir als Ausgabe im Browser:

Kann nützlich sein.

Zufälligen Wert aus dem Array holen

Dadurch dass du die Funktion mt_rand() bereits kennst und auch die Funktion count(), können wir ein zufälliges Element aus dem Array holen. Wie du schon kurz gesehen hast, übergeben wir Minimum und Maximum als Argumente, die Funktion spuckt uns dann einen zufälligen Wert aus der irgendwo zwischen diesen beiden Zahlen liegt. Das können wir nutzen um einen zufälligen Wert aus einem Array zu holen. Schau:

Wenn du die Seite jetzt im Browser aktualisierst, werden dir immer unterschiedliche Tiere angezeigt.

 

Links & Infos

FAQ

Assoziativer Index in einfachen oder doppelten Anführungszeichen?
Ah, da hat jemand aufgepasst. Ja, ich verwende oben im Code mal einfache ' und mal doppelte " Anführungszeichen. Welche du nimmst ist egal, das bleibt dir überlassen.

Indexiertes Array? Indiziertes Array? Assoziatives Array? Was denn nun??
Einen Index hat jedes Array – dies können Schlüssel vom Typ Integer (=numerisch) oder vom Typ String (=assoziativ) sein. Aber beim numerisch indexierten Array spricht man auch vom indizierten Array (auch wenn das eigentlich nicht ganz der korrekte Ausdruck dafür ist, indexiert ist eher richtig). In anderen Tutorials hast du das vielleicht wieder anders gelesen. Lass dich nicht verrückt machen, wichtig ist, dass der Zugriff numerisch oder assoziativ erfolgt. Fertig.

Fazit

„Deklaration von numerisch oder assoziativ indizierten Arrays“ … klingt ja richtig krass – und DU weißt jetzt sogar, was damit gemeint ist – sehr cool. Im nächsten Teil wird es richtig spannend, da kommt Interaktion in’s Spiel. Wir werden mit HTML-Formularen arbeiten, sodass man als Person vor dem Browser auch endlich mal was auf der Seite machen kann. Wir werden lernen, mit GET- und POST-Requests zu arbeiten (was viel schlimmer klingt als es ist) und Benutzereingaben zu verarbeiten. Außerdem werden Schleifen sich als äußerst praktisch erweisen, jetzt wo du Arrays kennengelernt hast.

Gruß
Marius

2 Gedanken zu „PHP lernen – Arrays“

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.