Array Numerisch
Ein Array ist eine Sammlung von Variablen, in numerischen Arrays sind diese Variablen durch nummeriert - beginnend bei [0]. PHP stellt viele Funktionen bereit, um Arrays zu erstellen, zu verändern,zu sortieren, zu analysieren und auszugeben.
Auf der Seite Assoziative Arrays sind weitere Array Funktionen beschrieben.
Array numerisch indexiert
Array erstellen und daraus einen Eintrag auslesen:
Der Index, also die Angabe, an welcher Position die Variable im Array steht,
wird bei der Vorgabe in eckige Klammern geschrieben. Da der Index im numerischen
Array eine Zahl ist, steht sie nicht in Anführungszeichen.
Arrays beginnen bei Null [0] zu zählen (wie in einem Haus, vor der 1. Etage kommt das Parterre).
<?php
$Tier [0] = "Hahn"; // Arrays beginnen bei Index 0
$Tier [1] = "Katze";
$Tier [2] = "Hund";
$Tier [3] = "Pferd"; // der vierte Eintrag hat Index 3
$Tier [4] = "Esel";
echo $Tier [3];
?>
Ich bräuchte den Schlüssel nicht vorzugeben, die Indexes werden dann automatisch durchnummeriert. Die Werte werden so immer an der Stelle des ersten freien Index oder am Ende angefügt.
<?php
$Tieer [] = "Hahn"; // Arrays beginnen immer bei 0 !
$Tieer [] = "Katze";
$Tieer [] = "Hund";
$Tieer [] = "Pferd";
$Tieer [] = "Esel";
// zur Auswahl muss man den Index kennen
echo $Tieer [3]."<br/>";
$Tieer [] = "Kuh"; // hinten hinzufügen geht ganz einfach
echo $Tieer [5]."<br/>";
// ändern: da ein Index nur einen Wert enthalten kann,
// wird ein vorhandener Eintrag einfach überschrieben:
$Tieer [2] = "Wolf <br />";
echo $Tieer [2];
$Tieer [] = "Affe"; // ein Zusätzlicher Eintrag fügt einen Wert am Ende an
echo end($Tieer); // Ausgabe letzter Eintrag
?>
Kuh
Wolf
Affe
Array Konstruktor
Kurze Schreibweise
array();
<?php
$Tire = array ("Hahn", "Katze", "Hund", "Pferd", "Esel") ; // Nummerierung erfolgt automatisch und beginnt bei 0
echo $Tire [3];
?>
Bestimmte Indexierung
1 => "...",
Will man die Nummerierung vorgeben, teilt man dem Schlüssel den Wert mit => zu. Diese Einträge werden extra in ungeordneter Reihenfolge benannt. So können Löcher entstehen, die sich in einer Schleifenabfrage seltsam auswirken.
<?php
$Tiere = array (1 => "Katze", 4 => "Esel", 2 => "Hund", 3 => "Pferd", 0 => "Hahn",) ;
echo $Tiere[3];
?>
Es liesse sich auch ein Numerischer Array beginnend mit dem Index 1 (ohne Index 0) erstellen (z.B. für die Monate im Jahr):
<?php
$Tiere = array (1 => "Katze", "Hund", "Pferd", "Esel");
if(!isset($Tiere[0])){
$return="Kein Index 0.";
} else {
$return="Index 0 is set.";
}
echo $return;
?>
Einträge am Ende hinzufügen
array_push()
<?php
array_push($Tiere,"Zebra","Affe");
?>
Das hatten wir schon gekonnt, mit $Tiere[]="Zebra"; $Tiere[]="Affe"; hätten wir das Gleiche erreicht.
Eine numerische Indizierung erfolgt immer automatisch, falls nichts angegeben wird (einem assoziativ indexierten Array kann so nichts hinzugefügt werden).
Auf diesen letzten Array beziehen sich nun alle folgenden Funktionen!
Array analysieren
Alle Funktionen ausser isset() setzen voraus, dass die Variable existiert.
Falls eine Variable aufgerufen wird, die gar nicht gesetzt ist, gibt es eine Fehlermeldung.
Ist diese Variable überhaupt gesetzt?
isset();
isset() fragt: Gibt es diese Variable, diesen Array überhaupt?
und gibt 1 für TRUE oder nichts für FALSE zurück.
echo isset($hjkl);
// FALSE falls hier nichts davor steht
echo !isset($hjkl);
1 // es ist TRUE, dass es $hjkl nicht gibt
Ist diese Variable ein Array?
is_array();
is_array() fragt: Ist diese Variable ein Array?
und gibt 1 für TRUE oder nichts für FALSE zurück.
echo is_array($Tiere);
1 // 1 für true
Zwei Funktionen um komplexe Arrays komplett darzustellen sind: print_r() oder var_dump() auf einer eigenen Seite.
Total der Einträge im Array?
count($ArrayName);
Zähle alle Einträge des Arrays:
<?php $anzahl = count($Tiere); // gibt Anzahl Einträge zurück echo $anzahl; ?>
6 // Anzahl Tiere
Die Anzahl Einträge kann ich in einer Schlaufe einsetzen:
<?php
$intZaehlerstand = 0;
while ($intZaehlerstand < $anzahl) {
echo "Noch " .($anzahl-$intZaehlerstand). " mal etwas verarbeiten ...
";
$intZaehlerstand += 1;
}
if ($intZaehlerstand == $anzahl){
echo "Fertig!";
}
?>
Noch 5 mal etwas verarbeiten ...
Noch 4 mal etwas verarbeiten ...
Noch 3 mal etwas verarbeiten ...
Noch 2 mal etwas verarbeiten ...
Noch 1 mal etwas verarbeiten ...
Fertig!
Ist ein Wert vorhanden?
in_array("Zebra",$Tiere);
Ist ein bestimmter Eintrag in diesem Array enthalten? in_array() gibt bloss true oder false zurück ...
echo in_array("Zebra",$Tiere);
1 // 1 falls Zebra da drin ist
echo in_array("Cebra",$Tiere);
// nichts, falls Cebra nicht da drin ist
Welchen Index hat das Zebra?
array_search ("Zebra", $Tiere);
Wo ist das Zebra?: array_search() gibt den Index zurück, ein Mehr an Information gegenüber in_array() bei gleichem Aufwand.
<?php
$finde = array_search ("Zebra", $Tiere);
echo "Index $finde ist ";
echo $Tiere[$finde]; // wie echo $Tiere[1]
?>
Der allerletzte Eintrag?
end($Tiere);
print end($Tiere);
Affe
foreach Schleife
Zum Abarbeiten von Arrays werden vorübergehend Variablen erstellt,
und bei jedem Durchgang überschrieben, nachdem sie ausgegeben wurden.
Löcher im Array sind Fehlerquellen bei der Array Ausgabe mittels
while und for Schleifen; also zum Arrays ausgeben besser die foreach Schleife nutzen!
Nur die Werte ausgeben:
foreach($Tiere as $Wert)
<?php
foreach($Tiere as $Wert)
{
echo $Wert ."<br />";
}
?>
Hund
Pferd
Esel
Zebra
Affe
Index und Werte ausgeben:
foreach($Tiere as $Index => $Wert)
<?php
foreach($Tiere as $Index => $Wert)
{
echo $Index," ist ", $Wert, "<br />";
}
?>
2 ist Hund
3 ist Pferd
4 ist Esel
5 ist Zebra
6 ist Affe
Die Reihenfolge entspricht derjenigen im Quelltext!
continue und break
continue; break;
continue und break werden auch innerhalb von do und while Schleifen verwendet.
continue und break werden innerhalb von foreach Schleifen verwendet:
continue um den aktuellen Durchlauf abzubrechen, es wird nur das Ende übersprungen
und beim nächsten Durchlauf fortgefahren.
break verlässt die Schleife ganz an Ort und Stelle.
<?php
$arr = array(1, 2, 3, 4, 5);
foreach($arr as $number) {
if($number == 2) {
continue; // Unterbruch
}
if($number == 4) {
break; // Abbruch
}
print $number; // Zahl ausgeben fals vorher nicht Abbruch
}
?>
So wird nicht 12345 ausgegeben sondern nur:
Arrays vergleichen
Kommen in einem Array-1 Einträge aus Array-2 vor?
Wir haben den grossen Array $Tiere. Den vergleichen wir mit dem kleineren Array $Huftiere:
<?php
$Huftiere = array ("Pferd", "Zebra", "Esel");
echo 'Im Array $Tiere sind folgende Huftiere enthalten:<br />';
foreach($Huftiere as $Huftier) {
if(in_array($Huftier, $Tiere)) {
echo $Huftier."<br />";
}
}
?>
Pferd
Zebra
Esel
Das Selbe, nämlich die Schnittmenge, erreiche ich durch eine vorgegebene Funktion:
array_intersect()
<?php $TrefferInTiere = array_intersect($Tiere, $Huftiere); print_r($TrefferInTiere); ?>
Ich könnte den ersten (grossen) Array sogar mit mehreren Arrays vergleichen!
Und auch die Restmenge, erhalte ich durch eine vorgegebene Funktion:
array_diff()
<?php $RestInTiere = array_diff($Tiere, $Huftiere); print_r($RestInTiere); ?>
Sind zwei Arrays gleich?
Ob zwei Arrays gleich oder gar identisch sind, und zwar im Schlüssel wie im Wert, lässt sich durch eine Gleichung herausfinden:
==
<?php
if($Tiere === $Huftiere or $Tiere == $Huftiere){
echo "Alle Tiere sind Huftiere.";
} else {
echo "Nicht alle Tiere sind Huftiere.";
}
?>
Array sortieren
Zum Sortieren von Arrays stellt PHP viele Varianten zur Verfügung. Einige sortieren nach Schlüssel ksort() andere nach Wert asort(). Beides auf- wie auch absteigend - mit einem r wie retour arsort() und krsort().
Sortiere ich Zahlen, möchte ich das nicht standartmässig sondern natürlich vornehmen.
Natürlich natsort() erziehlt die Folge 1, 2, 11, 12, 20, standartmässig entstünde
die Folge 1, 11, 12, 2, 20.
Auch die Gross- Kleinschreibung kann berücksichtigt werden mit natcasesort().
Und sogar eine zufällige Mischung gibt es: shuffle().
Mit Vorsicht zu geniessen ist die einfache Funktion sort(), sie sortiert die Werte und setzt neue, numerische Indizes - assoziative Arrays werden also numerisch.
Zuletzt gibt es auch eine Funktion, mit der ich mehrere Arrays auf einmal und mehrdimensionale Arrays sortieren kann array_multisort().
Nach Wert (array) absteigend (rückwärts) sortieren
arsort($Arrayname);
... und erneut ausgeben, die Reihenfolge hat geändert!
Zebra ist 5
Pferd ist 3
Katze ist 1
Hund ist 2
Esel ist 4
Affe ist 6
Aufsteigend hiesse der Befehl asort($Arrayname); -ohne 'r'
Array nach Index (key) aufsteigend sortieren
ksort($Arrayname);
1 ist Katze
2 ist Hund
3 ist Pferd
4 ist Esel
5 ist Zebra
6 ist Affe
Das 'k' bei ksort steht für Key (Schlüssel).
Absteigend hiesse der Befehl krsort($Arrayname); -mit 'r' wie Rückwärts.
Eintrag löschen oder hinzufügen
Am Ende löschen
array_pop(Arrayname);
1 ist Katze
2 ist Hund
3 ist Pferd
4 ist Esel
5 ist Zebra
Es fehlt jetzt der zuletzt hinzugefügte Eintrag 'Affe'!
Der Code sieht so aus:
<?php
array_pop($Tiere);
?>
<?php
foreach($Tiere as $Index => $Wert)
{
echo $Index," ist ", $Wert, "<br>";
}
?>
Drei Array Einträge am Anfang hinzufügen
array_unshift();
0: Floh
1: Alligator
2: Schwein
3: Katze
4: Hund
5: Pferd
6: Esel
7: Zebra
Es hat jetzt vorne 3 Tiere mehr und dadurch haben sich die Indexzahlen der früheren
Einträge verändert.
Der Code sieht so aus:
<?php
array_unshift($Tiere, "Floh", "Alligator", "Schwein")
?>
<?php
foreach($Tiere as $Index => $Wert)
{
echo $Index,": ", $Wert, "<br>";
}
?>
Einen Array Eintrag am Anfang Löschen
array_shift();
0 => Alligator
1 => Schwein
2 => Katze
3 => Hund
4 => Pferd
5 => Esel
6 => Zebra
Es hat jetzt vorne wieder keinen Floh mehr und dadurch haben sich die Indexzahlen
der anderen Einträge erneut verändert.
Der Code sieht so aus:
<?php
array_shift($Tiere)
?>
<?php
foreach($Tiere as $Index => $Wert)
{
echo $Index," => ", $Wert, "<br>";
}
?>
Array Eintrag ersetzen
array_splice()
array_splice() ersetzt einen Eintrag in einem Array und nimmt 4 Parameter entgegen.
Durch kluge Nutzung dieser Parameter kann ich unterschiedliche Lösungen erzielen,
wie das Löschen eines Array Eintrages von bliebiger Stelle, Einfügen eines Array
Eintrages an beliebiger Stelle und das Verschieben eines Array Eintrages (sh. weiter unten).
Die Parameter sind:
- Array in dem ersetzt wird
- Position des ersten zu ersetzenden Eintrags
- Länge des zu ersetzenden Stückes in Anzahl Einträgen
- der Ersatz Eintrag kann ein String oder eine Variable oder ein Array sein
Ersetzen eines beliebigen Array Eintrags
Im Array hat der erste Eintrag die Position 0. Es wird nur ein Eintrag ersetzt.
Der Alligator wird durch ein Krokodil ersetzt, statt "Krokodil" könnte auch
array("Krokodil", "Schlange") stehen, um mit zwei Begriffen zu ersetzen.
<?php
echo "vorher:<br />";
foreach($Tiere as $Index => $Wert) {
echo "$Index ist $Wert<br />";
}
array_splice($Tiere, 0, 1, "Krokodil"); // Position 0 ist der erste Eintrag
echo "<br />nachher:<br />";
foreach($Tiere as $Index => $Wert) {
echo "$Index ist $Wert<br />";
}
?>
0 ist Alligator
1 ist Schwein
2 ist Katze
3 ist Hund
4 ist Pferd
5 ist Esel
6 ist Zebra
nachher:
0 ist Krokodil
1 ist Schwein
2 ist Katze
3 ist Hund
4 ist Pferd
5 ist Esel
6 ist Zebra
Array Eintrag an bestimmter Stelle einfügen
Der Grashüpfer soll an Position 3 im Array eingefügt werden, dadurch verschiebt er die nachfolgenden Einträge nach hinten.
<?php
array_splice($Tiere, 3, 0, "Grashüpfer"); // 0 Einträge löschen
echo "nachher:<br />";
foreach($Tiere as $Index => $Wert) {
echo "$Index ist $Wert<br />";
}
?>
0 ist Krokodil
1 ist Schwein
2 ist Katze
3 ist Grashüpfer
4 ist Hund
5 ist Pferd
6 ist Esel
7 ist Zebra
Benachbarte Array Einträge tauschen
Der Grashüpfer soll im Array eine Stelle nach hinten (unten) verschoben werden. Das entspräche einem Tausch von 4 mit 3. Dazu nehme ich ab Position 3 zwei Einträge nämlich 3 und 4 raus und ersetze die mit den Einträgen 4 und 3 als Array.
<?php
$Ersatz = array($Tiere[4], $Tiere[3]);
array_splice($Tiere, 3, 2, $Ersatz); // ab Pos 3, entferne 2 Einträge, ersetze mit Array
echo "<br />nachher:<br />";
foreach($Tiere as $Index => $Wert) {
echo "$Index ist $Wert<br />";
}
?>
0 ist Krokodil
1 ist Schwein
2 ist Katze
3 ist Hund
4 ist Grashüpfer
5 ist Pferd
6 ist Esel
7 ist Zebra
Das Umgekehrte, das Verschieben eines Array Eintrags nach vorne, ist auch möglich. Z.B. das Pferd soll nun über den Grashüpfer springen. Ich würde die Positionen 4 und 5 durch die Positionen 5 und 4 ersetzen. Den Ersatz muss ich natürlich vorbereiten. Ich kann auch mehr Einträge ersetzen und die Anzahl Einträge die ersetzt werden, müssen nicht mit der Anzahl Ersatzeinträge übereinstimmen.
Array Eintrag an beliebige Position verschieben
Mit einer Funktion und einem Zwischenspeicher kann ich einen Eintrag an eine beliebige Position verschieben. Dabei zeigt sich, dass ich durch fehlenden Ersatz einfach ein Array Eintrag von beliebiger Position löschen kann.
<?php
function array_move($array, $oldpos, $newpos) {
$tmp = array_splice($array, $oldpos, 1); // ersatzlos gestrichen aber in Zwischenspeicher
array_splice($array, $newpos, 0, $tmp);
return $array;
}
$Tiere = array_move($Tiere, 3, 1);
echo "nachher:<br />";
foreach($Tiere as $Index => $Wert) {
echo "$Index ist $Wert<br />";
}
?>
0 ist Krokodil
1 ist Hund
2 ist Schwein
3 ist Katze
4 ist Grashüpfer
5 ist Pferd
6 ist Esel
7 ist Zebra
Den ganzen Rest ersetzen
Ab dem Pferd soll der restliche Array ersetzt werden. Ich kann die Position des Pferdes vom Ende des Arrays her angeben. Ich kann auf Nummersicher gehen und mehr Einträge wegnehmen als es hat, ohne Fehler zu erzeugen (das ist in dem Beispiel unsinnig, weil ich ja von Hinten zähle).
<?php
// ab der 3.letzten Position, entferne alles (ich könnte auch 1000 Einträge löschen)
$Resttiere=array_splice($Tiere, -3, count($Tiere), "Huftier");
echo "<br />nachher:<br />";
foreach($Tiere as $Index => $Wert) {
echo "$Index ist $Wert<br />";
}
?>
0 ist Krokodil
1 ist Hund
2 ist Schwein
3 ist Katze
4 ist Grashüpfer
5 ist Huftier
array_splice() gibt ein Array zurück, das aus den ausgeschnittenen Einträgen besteht (das hatte ich schon weiter oben in \$temp genutzt).
<?php
echo "der Rest war:<br />";
foreach($Resttiere as $Index => $Wert) {
echo "$Index ist $Wert<br />";
}
?>
0 ist Pferd
1 ist Esel
2 ist Zebra
Array in einzelne Variablen teilen
list()
list() weist Einträge eines numerischen Arrays einzelnen Variablen zu. Dazu werden erst Variablennamen erzeugt. Soviele Variablen wie benannt wurden, sovielen können dann auch Einträge zugewiesen werden, und zwar beginnend mit dem Arrayeintrag 0.
<?php
list($ti0, $ti1, $ti2, $ti3) = $Tiere;
echo '$ti0 enthält nun '.$ti0.', $ti1 enthält nun '.$ti1.', $ti2 enthält nun '.$ti2.', $ti3 enthält nun '.$ti3;
?>
Möchte ich nur den Indice [2] ausgeben, muss ich für [0] und [1] einen leeren Listenplatz vorsehen.
<?php
list( , , $ti2) = $Tiere;
echo '$ti2 enthält nun '.$ti2;
?>
Wie ein Array in Strings auseinandergenommen wird und Strings zum Array werden:
String zu Array zu String
Map Funktion
array_map()
Jedes Element eines arrays einer Funktion übergeben (in lower cases wandeln), das Resultat in einer Variablen ($Tiere_lc) auffangen und wiedergeben:
<?php
$Tiere_lc = array_map("strtolower", $Tiere);
print($Tiere_lc[3]);
?>
Der Array $Tiere wurde dabei nicht verändert, schau <?php echo $Tiere[3]; ?> Katze ist noch mit einem Grossbuchstaben geschrieben.
Mehrdimensionaler Array
Die sind wie Tabellen, mit 'Spalten' und 'Zeilen':
| $multi | 0 | 1 | 2 |
|---|---|---|---|
| 0 | 001 | 002 | 003 |
| 1 | 004 | 005 | 006 |
Multi-Array mit [Identifizierer] erstellen
$ArrayName [Zeile] [Spalte] = "Eintrag"
Für die Abarbeitung braucht es 2 foreach-Schleifen, denn wir haben ja 2 Dimensionen.
<?php
$multi [0] [0] = "001"; // die Zahlen in " sind Strings
$multi [0] [1] = "002";
$multi [0] [2] = "003"; // erste Zeile Index 0, dritte Spalte Index 2
$multi [1] [0] = "004";
$multi [1] [1] = "005";
$multi [1] [2] = "006";
foreach ($multi as $dim1)
{
foreach ($dim1 as $dim2)
{
echo "$dim2<br />\n";
}
}
?>
002
003
004
005
006
Multi-Array mit array(); Konstruktoren erstellen
<?php$multipl=array ( // Spalten entsprechend Anzahl Einträgen in Zeilen
array ("001","002","003"), // Zeile 0
array ("004","005","006") // Zeile 1
);
print $multipl [0][2]; // erste Zeile Index 0, dritte Spalte Index 2
?>
Ausgabe (eines Wertes):
003