PHP Tutorial – Schritt 16: Arrays (und Schleifen)

Um Werte zu definieren und abzurufen verwendeten wir bis dato einfache Variablen. Dies war vor allem beim “Suchen und Ersetzen”-Thema zwar recht übersichtlich, aber auch unbrauchbar da wir von der Anzahl der Variablen aus Gründen der Programmierung und der Übersicht sehr beschränkt waren. Um mehrere Werte zu speichern und abzurufen gibt es in PHP sogenannte Arrays.|

Man kann sich ein Array wie einen großen Büroschrank mit unzähligen Fächern vorstellen, bei dem wir selbst Namen vergeben, den Inhalt bestimmen und bearbeiten und beliebig erweitern können. Arrays sind eine sehr nützliche Funktion um Daten zu verarbeiten und werden dir den Alltag definitiv erleichtern.|

Arrays aufbauen und abrufen

Am Besten fangen wir doch mal mit einem praktischen Beispiel an:

<?php

$wochentage = array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag");

?>

Wenn du diesen Code mit einem echo-Befehl ausführst, erhälst du die Ausgabe “Array”
Warum? Weil die Variable “$wochentage” mit dem Code

array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag");

als Array defniert wurde. Du hast Quasi die Schublade mit dem Namen “wochentage” erstellt und dort die Zettel “Sonntag, Montag, Dienstag, usw.” abgelegt. Würdest du nun zu einem Mitarbeiter gehen und zu ihm sagen “Geh zum Schrank und sag mir was in der Schublade “wochentage” drin ist, so würde er dir nicht die Zettel vorlesen, sondern sagen: “Es sind viele Zettel drinnen” <- Array – Genau das macht PHP in diesem Fall.|

Wenn du also wissen willst, was auf einem bestimmten Zettel steht, so musst du das auch dem Mitarbeiter sagen:

<?php

echo $wochentage[1];

?>

In diesem Fall wird die Antwort “Montag” sein.
Montag deswegen, weil…. ? – Ja, weil PHP bei “0” (Null) anfängt zu zählen. Sonntag = 0, Samstag = 6|

Assoziative Arrays

Mit vielen Datenmengen wäre das aber sehr umständlich stets die genaue Position des jeweiligen “Zettels” zu kennen, oder? Man stelle sich nur vor, man hat mehr als 100 Datensätze und will nur den Inhalt von einem Zettel wissen oder ändern… deshalb bietet PHP die Möglichkeit die Nummerierung in eine eigene Benennung vorzunehmen:

$wochentage = array("so" => "Sonntag","mo" => "Montag","di" => "Dienstag","mi" => "Mittwoch","do" => "Donnerstag","fr" => "Freitag","sa" => "Samstag");

Das heißt… anstatt nur den Wert in das Array zu schreiben, gibst du ein Kürzel mit damit du es später leicht findest und per Kürzel zugreifen kannst:

"mo" => "Montag"

Die Abfrage funktioniert dann auch nicht mehr per Ziffer/Position, sondern per Kürzel:

<?php

echo $wochentage["mo"];

?>

Am Besten du spielst einmal diese beiden Szenarien auf http://phpfiddle.org/ durch 🙂|

Hinzufügen von Werten

Arrays sind hin jeder Hinsicht sehr flexibel, so kann man bei den “Standard”-Arrays ganz leicht neue Werte hinzufügen:

$wochentage[] = "Weihnachten";

Somit hast du nun im Array neben den Werten “Sonntag” bis “Samstag” auch den Wert “Weihnachten”… also in Summe 8 Elemente (wobei das das 7te ist, da ja PHP mit “0” (Null) anfängt zu zählen!).|

In assoziativen Arrays

Bei diesen Arrays muss man auch das Kürzel mit dem neuen Wert mitschicken. Also sagen wir ganz einfach:

$wochentage[we] = "Weihnachten";

Ich habe mich bei dem Wert “Weihnachten” für das Kürzel “we” entschieden. Dies kannst du aber frei wählen, du musst nur bedenken dass es auch frei ist, denn sonst bist du im nächsten Abschnitt “Ändern von Werten” 🙂|

Ändern von Werten

In Arrays wo du quasi ohne eigene Benennung arbeitest, also per Nummerierung, kann man die Elemente recht einfach ändern, wenn du die Position kennst:

$wochentage[3] = "Feiertag";

Somit änderst du den 4ten (!) Wert des Arrays von “Dienstag” auf “Feiertag”.
Warum..? weil das erste Element mit 0 (Null) beginnt…|

In assoziativen Arrays

In assoziativen Arrays kann man ebenfalls auf einfache Art und Weise auch Werte ändern:

$wochentage["di"] = "Feiertag";

Beispiel

Für unser Beispiel würde der gesamte Code so aussehen:

<?php

# Array definition
$wochentage = array("so" => "Sonntag","mo" => "Montag","di" => "Dienstag","mi" => "Mittwoch","do" => "Donnerstag","fr" => "Freitag","sa" => "Samstag");

# Ausgabe des Wertes mit dem Kürzel "di";
echo "Der Wert für di lautet: " . $wochentage["di"];
echo "<br>";

$wochentage["di"] = "Feiertag";

# Ausgabe des Wertes mit dem Kürzel "di";
echo "Der neue Wert für di lautet: " . $wochentage["di"];

?>

Zählen der Elemente

Natürlich kannst du auch die Elemente in einem Array jederzeit zählen lassen. Dies funktioniert mit der Funktion:

<?php

# Array erstellen
$wochentage = array("so" => "Sonntag","mo" => "Montag","di" => "Dienstag","mi" => "Mittwoch","do" => "Donnerstag","fr" => "Freitag","sa" => "Samstag");

# Ausgabe der gezählten Elemente
echo count($wochentage);

?>

Durch “count()” kannst du also jederzeit die Anzahl ausgeben. Wichtig: In diesem Fall gibt dir PHP die tatsächliche Anzahl (also in diesem Fall 7) aus. Hier beginnt PHP nicht mit “0” (Null). Etwas verwirrend… aber man gewöhnt sich dran.|

Ausgeben der Elemente

Natürlich wäre es auch nicht schlecht, wenn wir die Elemente in einem Array ausgeben könnten, oder? Grundsätzlich macht man das mit Schleifen (ja, das  haben wir schon gelernt: Schritt 8: If-Anweisung in PHP). Ich zeige dir die 3 möglichen Schleifen mit entsprechenden Kommentaren im Code.|

For-Schleife

<?php

# Definition des Arrays
$wochentage = array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag");

# Definition der For-Schleife
for($i=0; $i < count($wochentage); $i++)  # Siehe unten die Erklärung zur For-Schleife
   {
	# Beginn der Schleife
   echo $wochentage[$i]."<br>"; # Ausgabe des jeweiligen Elements
   }


# Grundsätzliches zum Aufbau einer For-Schleife
# for(zählanfangswert; bedingung; zählwert pro durchgang)
# $i=0 > setze den Zähle zu beginn auf Null
# $i < count($wochentage) > durchlaufe die Schleife so lange bis $i = Elemente im Array ist
# $i++ > Zähle nach jedem Durchgang bei $i +1

?>

While-Schleife

<?php

# Definition des Arrays
$wochentage = array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag");

# Definition der While-Schleife
$i = 0;
while($i < count($wochentage)) # Siehe unten die Erklärung zur While-Schleife
   {
   echo $wochentage[$i]."<br>"; # Ausgabe des jeweiligen Elements
   $i++; # Erhöhe den Zählwert
   }


# Grundsätzliches zum Aufbau einer While-Schleife
# Der Zählanfangswert wird irgendwo vor der Schleifendefinition fixiert > $i=0;
#
# while(bedingung) in diesem Fall ($i < count($wochentage))
# $i < count($wochentage) > durchlaufe die Schleife so lange bis $i = Elemente im Array ist
# 
# Die Erhöhung des Zählwerts wird in der Schleife verankert
# $i++ > Zähle nach jedem Durchgang bei $i +1

?>

Funktioniert beides recht gut, oder? Dann gibt es noch eine “bequemere” Ausgabemöglichkeit:|

Foreach-Schleife

<?php

# Definition des Arrays
$wochentage = array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag");

# Definition der Foreach-Schleife
foreach($wochentage AS $name) # Es werden alle Elemente in einer Variable gespeichert
   {
   echo $name."<br>"; # Und anschließend ausgegeben, gibt es keine Elemente mehr, stoppt die Schleife
   }


?>

Array durchsuchen

Arrays können richtig groß werden. Demzufolge ist es hin und wieder mehr als hilfreich, wenn man Arrays auch durchsuchen kann:

<?php

# Definition des Arrays
$wochentage = array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag");

if(in_array("Mittwoch",$wochentage))
   {
   echo "Mittwoch ist in dem Array enthalten";
	echo "<br>";
   }


# Bzw. auch auf "dynamische" Art und Weise:
$suchwort = "mittwoch";

if(in_array($suchwort,$wochentage))
   {
   echo "$suchwort ist in dem Array enthalten";
   }
else
  {
   echo "$suchwort ist in dem Array NICHT enthalten";
   }
	
?>

Du siehst in diesem Beispiel… Groß-/Kleinschreibung spielt in PHP oft eine Rolle, denn “mittwoch” kann im gleichen Array nicht gefunden werden. “Mittwoch” aber sehr wohl. Und jetzt können wir zum ersten Mal die RegEx Suchmuster (siehe Schritt 14: RegEx und preg_replace und Schritt 15: preg_replace im Einsatz) anwenden:

<?php

# Definition des Arrays
$wochentage = array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag");


$joker = preg_grep("/.ittwoch/",$wochentage); # Suchemuster via RegEx

foreach($joker AS $name) # Es werden alle Elemente in einer Variable gespeichert
   {
   echo $name."<br>"; # Und anschließend ausgegeben, gibt es keine Elemente mehr, stoppt die Schleife
   }

?>

Da wir nun eine neue Variable namens “$joker” definieren, können wir mit dem Punkt (.) nach jedem x-beliebigen Zeichen suchen:

$joker = preg_grep("/.ittwoch/",$wochentage); # Suchemuster via RegEx

Somit wird in jedem Fall “Mittwoch”, “mittwoch”, aber auch “sittwoch”, oder “bittwoch” gefunden 🙂

Weißt du denn auch, was wir eingeben müssten, wenn wir wirklich nur nach “Mittwoch” und “mittwoch” suchen möchten?

Lösung: $joker = preg_grep(“/[mM]ittwoch/”,$wochentage);

Perfekt! Aber mit Arrays kann man noch mehr machen:|

Arrays sortieren

Arrays, bzw. deren Inhalt kann man mittels “asort()”; bzw. “arsort()” und “ksort()” bzw. “krsort()” sortieren:

<?php

# Definition des Arrays
$wochentage = array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag");

#Zuerst unsortiert:
echo "Die unsortierte Liste:<br>";
foreach($wochentage AS $name) 
   {   echo $name."<br>";  }

# Jetzt sortieren wir per Alphabet A-Z
asort($wochentage);

echo "<br>Die sortierte Liste von A-Z:<br>";
foreach($wochentage AS $name) 
   {   echo $name."<br>";  }

# Jetzt sortieren wir per Alphabet Z-A
arsort($wochentage);
echo "<br>Die sortierte Liste von A-Z:<br>";
foreach($wochentage AS $name) 
   {   echo $name."<br>";  }

# Jetzt sortieren wir nach Schlüssel aufsteigend
ksort($wochentage);
echo "<br>Die sortierte Liste nach Schlüssel aufsteigend:<br>";
foreach($wochentage AS $name) 
   {   echo $name."<br>";  }

# Jetzt sortieren wir nach Schlüssel absteigend
krsort($wochentage);
echo "<br>Die sortierte Liste nach Schlüssel absteigend:<br>";
foreach($wochentage AS $name) 
   {   echo $name."<br>";  }

?>

Cool und einfach, oder?
Aber es gibt noch mehr von Arrays zu wissen… deshalb gehen wir nun mal zum nächsten Beitrag

|