Arrays und Loops
Arrays (auch Listen genannt) gehören zu den Datentypen, die nicht nur einen Wert, sondern auch eine Struktur zur Aufnahme beliebig vieler Werte enthalten. Die Idee ist eigentlich simpel: Sie gruppieren Daten, die zusammen gehören. Sich darin zurechtzufinden, ist jedoch am Anfang nicht ganz leicht, besonders, wenn man nicht einfach nur eine Liste vor sich hat, sondern eine mehrdimensionale Struktur. Du kannst dich damit vertrauter machen, indem du dir Listenansichten suchst und dir überlegst, wie das Daten-array dazu aussehen sollte, damit man diese erstellen kann. Erzeuge Loops, die diese Daten in einer HTML Struktur ausgeben. Das Layout kann eine Galerie sein, eine Tabelle oder auch eine Liste, vielleicht sogar eine Navigation mit Links...
Aufgrund ihrer praktischen Struktur, ist das Resultat (oder auch: Rückgabewert) vieler Funktionen, mit denen Daten empfangen werden können, ein Array.
Einige typische Beispiele "aus dem richtigen Leben"
explode() - einen String anhand eines Trennzeichens in Einzelteile zerlegen
$string = "Ich lerne PHP programmieren";
$worte = explode(" ", $string); // gibt ein Array aller Worte zurück
scandir() - alle Dateinamen aus einem Verzeichnis lesen
$ordner = "bilder"; // "bilder" ist ein Ordner
$dateien = scandir($ordner); // Alle Namen der Datein in "bilder"
PDOStatement::fetchAll() - Daten aus der Datenbank lesen
$abfrage = $dbobj->prepare("SELECT name, email FROM subscriber"); // Abfrage mittels vorher erstelltem DB Objekt vorbereiten
$abfrage->execute(); // Abfrage ausführen
$empfaenger = $abfrage->fetchAll(); // Array mit allen gefundenen Datensätzen
So geht's
1. Mit Arrays arbeiten
Bevor wir mit Arrays arbeiten, hier das wichtigste - wir können Arraystrukturen als ganzes nicht mit echo ausgeben, aber bei Arrays (und Objekten) ist es noch wichtiger, sich einen Überblick zu verschaffen, nicht nur, aber besonders dann, wenn wir sie nicht selbst geschrieben, sondern erhalten haben. Wir benötigen oft einen "Monitor", um die gesamte Struktur überprüfen zu können. So kann ein Array ausgegeben werden:
echo "<pre>";
print_r( $array );
echo "</pre>";
Der <PRE> Tag dient übrigens der Strukturierung der Ausgabe. So sieht das Array auch im Quellcode aus. Es ist jedoch einfacher, die übersichtliche Darstellung direkt im HTML zu sehen statt in die Quellcodeansicht wechseln zu müssen.
Angenommen, du hast ein Array mit drei Strings (Apfel, Birne und Zitrone), sieht das Resultat von print_r z.B. so aus - es dient wirklich nur als Monitor zu Debugging-Zwecken:
Array
(
[0] => Apfel
[1] => Birne
[2] => Zitrone
)
2. Die verschiedenen Array-Strukturen vergleichen
Indexiertes Array - die einfache Liste
Erstelle erst ein Array mit ein paar Namen deiner Klassenkameraden. Dies ist ein indexiertes Array, die Indexierung geschieht automatisch durch Nummerierung. Die Ausgabe mit print_r zeigt eine nummerierte Liste von beliebig vielen gleichen Elementen - es kommt nicht darauf an, welcher Wert an welcher Stelle steht. Weil die Nummerierung automatisch geschieht, und es nicht wichtig ist wer welche Nummer bekommt, musst du den Index nicht definieren, du musst nur die Werte kommagetrennt mitgeben:
$studenten = array("Lilly", "Simon", "Anna");
Assoziatives Array - die Datengruppierung
Erstelle nun ein Array mit deinen persönlichen Angaben. Hier ist es wichtig, was wo steht, denn der Name ist nicht die E-Mail Adresse. Deshalb erstellst du die indexierung selbst und kannst statt Zahlen bezeichnende Strings wählen. Die Ausgabe mit print_r zeigt eine Liste von spezifischen Werten mit Label - es ist wichtig, dass wir anhand des Labels erkennen können, welcher Wert was bedeutet, damit wir beim Auslesen den richtigen Wert erwischen. Weil du den Werten eindeutige Labels zuweist, heisst diese Art von Array "assoziativ":
$student = array(
["vorname"] => "Lilly",
["nachname"] => "Müller",
["email"] => "This email address is being protected from spambots. You need JavaScript enabled to view it. "
);
Mehrdimensionales Array - die Datensammlung
Möchte man nun die Daten von allen Studenten deiner Klasse gruppieren (um sie mit einem einzigen Loop verarbeiten zu können), kann man die beiden Arraystrukturen auch kombinieren. Man nennt dies dann "mehrdimensional". Es gibt keine Grenze, jedoch ist in der Praxis meist eine Struktur mit 2 oder maximal 3 Ebenen genügend.
Hier siehst du die Kombination der ersten zwei Beispiele - eine Liste von gruppierten Daten zu jeweils einem Studenten:
$studentendaten = array(
array(
["vorname"] => "Lilly",
["nachname"] => "Müller",
["email"] => "This email address is being protected from spambots. You need JavaScript enabled to view it. "
),
array(
["vorname"] => "Simon",
["nachname"] => "Graf",
["email"] => "This email address is being protected from spambots. You need JavaScript enabled to view it. "
),
array(
["vorname"] => "Anna",
["nachname"] => "Muster",
["email"] => "This email address is being protected from spambots. You need JavaScript enabled to view it. "
)
);
Hinweis: die Personendaten in diesen Beispielen sind frei erfunden, allfällige Ähnlichkeiten mit echten Personen sind nicht beabsichtigt.
3. Loops / Iterationen vergleichen
Genau wie die manuelle Arbeit durch ein Fliessband ersetzt werden kann, wenn die Materialien, die gebraucht werden, in einer regelmässigen Form durch eine Fabrik geschleust werden, so ist es mit Loops möglich, ein paar Zeilen Code unabhängig von der Anzahl von Daten zu wiederholen, ohne sie mehr als einmal schreiben zu müssen. Weil verschiedene Array-Typen existieren, die für unterschiedliche Anwendungen nützlich sind, stehen auch unterschiedliche Loops zur Verfügung.
For - numerische Akrobatik
Willst du durch ein nummeriertes Array loopen, hast du mit for() einen Zähler zur Hand, der sowohl vorwärts als auch Rückwärts funktioniert, ja sogar theoretisch auch immer zwei Schritte weiter gehen kann - den Zähler kannst du selbst festlegen:
for ($i=0; $i<count($studenten); $i++){
echo $studenten[ $i ]; // mittels Integer aus dem Zähler auf die Array-Position zugreifen
}
Foreach - automatisches Loopen ohne (sichtbaren) Zähler
Willst du durch ein assoziatives Array loopen, musst du dich auf den internen Zähler verlassen, welcher eine Array-Position nach der anderen abarbeitet, denn mit einer Zahl kannst du nicht viel erreichen beim assoziativen Array. Dafür brauchst du eine Variable, in welcher der Wert der aktuellen Position zwischengespeichert wird. Foreach ermöglicht dies mit einer selbst benannten Variable, die wie ein Platzhalter funktioniert:
foreach ( $student as $wert ){
echo $wert; // mittels selbst benannter Variable auf die Array-Position zugreifen
}
Du kannst übrigens auch für den assoziativen index eine solche Variable definieren, wenn du auf das Label (den Index) auch zugreifen möchtest:
foreach ( $student as $label => $wert ){
echo $label.": ".$wert; // mittels selbst benannten Variablen auf key und value zugreifen
}
Durch mehrdimensionale Arrays loopen
Sobald du einen numerischen Index hast, kannst du mit for() arbeiten. Foreach ist etwas abstrakter, macht jedoch den Zugriff von der Hauptvariable mit dem index unnötig. Daher ist gerade für mehrdimensionale Arrays oft trotzdem foreach() praktischer. Hier der Vergleich, erst mit for() und dann foreach()
for ( $i=0; $i<count($studentendaten); $i++ ){
echo $studentendaten[ $i ][ "vorname" ]; // Zugriff "von oben" mittels numerischem index und label
}
foreach ( $studentendaten as $studi ){
echo $studi[ "vorname" ]; // Zugriff direkt via Platzhaltervariable und label
}Tips und Links
- Probiere die verschiedenen Loops mit den verschiedenen Arrays aus. Es ist vieles möglich, aber es eignen sich doch nicht alle Arraystrukturen und alle Loops gleich gut für einander. Kannst du eine Faustregel ableiten für dich?
- Du weisst, dass du mit FOR / FOREACH die zeilen Code, die zwischen den {} Klammern stehen, mehrfach ausführen lassen kannst. Überlege dir eine regelmässige HTML-Struktur, die über ein Array befüllt werden könnte, z.B. die Blogeinträge aus dem Demoprojekt. Wie würde das Array zu diesen Daten aussehen? Wie könnte der Loop im HTML ausgeführt werden?
Finde dich in mehrdimensionalen Datenstrukturen zurecht.