Websiteentwicklung: PHP: Arrays

Aus Wikibooks

Numerische Arrays[Bearbeiten]

Ein Array ist ein Feld, welches verschiedene Elemente, verschiedenen Typs enthalten kann. Diese werden dann über ihren Index angesprochen. Das erste Element bekommt den Index 0, das zweite Element bekommt den Index 1 usw. .

Um Arrays zu erstellen, verwendet man das Sprachkonstrukt array. Auch wenn die Benutzung vergleichbar mit der einer Funktion ist, handelt es sich um keine Funktion!

Im folgenden wird ein eindimensionales Array namen erstellt:

<?php
$namen = array('Hans', 'Anton', 'Tina', 'Max', 'Claudia');
?>

Die einzelnen Einträge werden dann über ihren Index aufgerufen:

echo $namen[2];

Ausgabe:

Tina

Beachten Sie, dass die Nummerierung bei 0 anfängt! In unserem Beispiel wird also der dritte Name Tina ausgegeben, und nicht wie vielleicht erwartet Anton. Das Nichtbeachten dieser Eigenschaft kann leicht zu Fehlern führen.

Assoziative Einträge[Bearbeiten]

Es ist aber auch möglich, für die einzelnen Einträge Namen zu vergeben, mit denen die Einträge angesprochen werden:

<?php
$namen = array(
	'Müller'  => 'Hans',
	'Maier'   => 'Anton',
	'Schmidt' => 'Tina',
	'Wagner'  => 'Max',
	'Reiter'  => 'Claudia',
);
?>

Um den Namen Max ausgeben zu lassen, müsste man das schreiben:

echo $namen['Wagner'];

Ausgabe:

Max

Hinzufügen von Einträgen[Bearbeiten]

Um neue Elemente in ein Array hinzuzufügen kann man folgende Syntax verwenden:

<?php
$array[] = 'wert';
$array[] = 'anderer wert';
?>

Mehrdimensionale Arrays[Bearbeiten]

Arrays können beliebig viele Dimensionen haben. Das heißt, sie können beliebig verschachtelt sein.

Ein 2-dimensionales Array kann folgendermaßen erstellt werden:

<?php
$personenliste = array(
	array(
		'Name' => 'Max Gutensen',
		'Adresse' => 'Breitscheider Straße 11',
		'Ort' => 'Bremen',
		'PLZ' => 54893,
	),
	array(
		'Name' => 'Lisa Meier',
		'Adresse' => 'Lautenschlagerstraße 23b',
		'Ort' => 'Stuttgart',
		'PLZ' => 70173,
	),
);
?>

Das numerische Array $personenliste enthält nun zwei Felder, die wiederum jeweils vier Felder enthalten.

Auf beispielsweise die zweite Adresse kann nun wie folgt zugegriffen werden:

<?php
echo $personenliste[1]['Adresse'];
?>

Ausgabe:

Lautenschlagerstraße 23b
Hinweis

In PHP kann auch nach dem letzten Array-Eintrag ein Komma stehen. Dies ist hilfreich, wenn die Arrays später manuell (im Editor) erweitert, verkürzt oder umsortiert werden. Auf diese Weise kann man Parsing-Fehler vermeiden, da insbesondere große Arrays (z.B. zur Konfiguration einer Anwendung) schnell recht unübersichtlich werden.

Zählen der Einträge[Bearbeiten]

Das Zählen der Einträge erfolgt durch die Funktion Count:

$menge_der_elemente = count($array);

Einträge durchsuchen[Bearbeiten]

Wenn man ein Array nach einem Eintrag durchsuchen will, geht das so:

<?php
if (in_array('Hans', $namen)) {
    echo "Hans war hier!";
}
?>

Wenn man den Index eines Wertes dabei zurückgeliefert haben will, geht das so:

<?php
$namen = array(
        'Müller'  => 'Hans',
        'Maier'   => 'Anton',
        'Schmidt' => 'Tina'
);

$nachname = array_search('Anton', $namen); // => Maier
?>

Sortieren der Einträge[Bearbeiten]

Man kann Arrays auch sortieren. Möchte man die Werte sortieren, geht das mit asort:

asort($namen);

Wenn man aber nach den Namen der Werte sortieren lassen will (falls welche zugeteilt wurden) benutzt man ksort.

ksort($namen);

Um die Werte bzw. Namen der Einträge in umgekehrter Reihenfolge zu sortieren, verwendet man krsort bzw. arsort.

Manche Arrays, etwa mehrdimensionale, oder solche, die Instanzen von Klassen (Objekte) Inhalten, können nicht so einfach sortiert werden, dass die genannten Funktionen benutzt werden können. Für kompliziertere Sortieralgorithmen kann man sich eine eigene Funktion schreiben. Um die $personenliste aus dem Abschnitt "Mehrdimensionale Arrays" nach Postleitzahlen zu sortieren, kann wie folgt vorgegangen werden:

<?php

function vergleiche($a, $b)
{
    if ($a['PLZ'] == $b['PLZ']) {
        return 0;
    }
    return ($a['PLZ'] < $b['PLZ']) ? -1 : 1;
}

usort($personenliste, 'vergleiche');

?>

Der Funktion usort wird neben dem zu sortierenden Array auch der Name der eigenen Sortierfunktion übergeben. Die Sortierfunktion muss:

  • Wenn das erste Feld (hier $a) vorgestellt werden soll, -1 zurückgeben.
  • Wenn die beiden Felder nicht getauscht werden sollen, 0 zurückgeben.
  • Wenn das zweite Feld (hier $b) vorgestellt werden soll, 1 zurückgeben.

Um in einer Sortierfunktion Strings zu sortieren, kann strcmp($string1, $string2) verwendet werden, strcmp gibt wie erwartet -1, 0 oder 1 zurück.

Da man mit der Sortierung von Arrays allein nichts anfangen kann, kommt jetzt die Schleife Foreach.

ein Array durchlaufen – foreach[Bearbeiten]

Mit dem foreach-Konstrukt kann über ein Array oder ein Objekt iteriert werden, das heißt alle Einträge werden nacheinander in einer Schleife aufgerufen und können dann verwendet werden. Die foreach-Schleife ist die einfachste Möglichkeit ein Array oder Objekt zu durchlaufen. Alle Einträge eines Arrays werden in jedem Schleifendurchlauf einer Variable zugewiesen, deren Name nach dem Schlüsselwort as angegeben wird.

foreach($array as $aktuellerWert) {
    echo $aktuellerWert . "\r\n";
}

Benötigt man zusätzlich den Schlüssel (Bezeichner in einem assoziativem Array) zu jedem Wert, kann dieser durch folgende Syntax in jedem Schleifendurchlauf gefüllt werden:

foreach ($array as $aktuellerSchlüssel => $aktuellerWert) {
    echo $aktuellerSchlüssel . ': ' . $aktuellerWert . "<br />\r\n";
}

End[Bearbeiten]

Mit end springt man an das Ende eines Arrays und gibt diesen Wert zurück

$namen = array('Hans', 'Anton', 'Tina', 'Max', 'Claudia');
echo end($namen);

Ausgabe: Claudia

Arrays analysieren[Bearbeiten]

Sollte es einmal notwendig sein, ein Array, das eventuell selbst aus Arrays besteht, genauer zu untersuchen, kann die Funktion var_dump() verwendet werden:

$arr = array("ich", array("bin", "nur"), array("ein", "kleiner"), "array", array("der", "dich"), "mag");

var_dump($arr);

Dies generiert folgende Ausgabe.

array(6) {
  [0]=>
  string(3) "ich"
  [1]=>
  array(2) {
    [0]=>
    string(3) "bin"
    [1]=>
    string(3) "nur"
  }
  [2]=>
  array(2) {
    [0]=>
    string(3) "ein"
    [1]=>
    string(7) "kleiner"
  }
  [3]=>
  string(5) "array"
  [4]=>
  array(2) {
    [0]=>
    string(3) "der"
    [1]=>
    string(4) "dich"
  }
  [5]=>
  string(3) "mag"
}

Alternativ kann man die weniger komplexe Funktion print_r() verwenden. Um eine Ausgabe zu erhalten, welche geparst werden kann (also die eigentliche Array-Notation), kann var_export() verwendet werden.

Arrays und Objekte[Bearbeiten]

Sehr hilfreich ist zuweilen auch die Eigenschaft, dass sich Objekte in Arrays und Arrays in Objekte casten lassen. Außerdem können beide Typen gleichermaßen mit einer foreach-Schleife durchlaufen werden. Als nettes Schmankerl gibt es auch noch das ArrayObject, welche Klassenmethoden aufweist, aber auf die Inhalte wird wie bei einem Array zugegriffen.

Beispiele für casting:

<?php
/* ein Array um Daten zu speichern: */
$personArray = array(
	'Name' => 'Max Gutensen',
	'Adresse' => 'Breitscheider Straße 11',
	'Ort' => 'Bremen',
	'PLZ' => 54893,
);

/* caste das Array in ein Objekt */
$personObjekt = (object)$personArray;

var_dump($personArray['Adresse']);
var_dump($personObjekt->Adresse);
?>

Ausgabe:

string(24) "Breitscheider Straße 11"
string(24) "Breitscheider Straße 11"
<?php
/* ein Objekt um Daten zu speichern: */
$personObjekt = new stdClass();
$personObjekt->Name = 'Max Gutensen';
$personObjekt->Adresse = 'Breitscheider Straße 11';
$personObjekt->Ort = 'Bremen';
$personObjekt->PLZ = 54893;

/* caste das Objekt in ein Array */
$personArray = (array)$personObjekt;

var_dump($personArray['Adresse']);
var_dump($personObjekt->Adresse);
?>

Ausgabe:

string(24) "Breitscheider Straße 11"
string(24) "Breitscheider Straße 11"