SELFPHP

SELFPHP-Druckversion
Original Adresse dieser Seite:
http://www.selfphp.de/praxisbuch/praxisbuchseite.php?site=159&group=28
© 2001-2017 E-Mail SELFPHP OHG, info@selfphp.de
© 2005-2017 E-Mail PHP5 Praxisbuch - Matthias Kannengiesser, m.kannengiesser@selfphp.de


Mehrdimensionale Arrays


Die Elemente eines Arrays können nicht nur Werte einfacher Datentypen (Zahlen, Strings, boolesche Werte), sondern auch Objekte oder andere Arrays sein. Letzteres eröffnet einige interessante Möglichkeiten. Um Ihnen den Einstieg in mehrdimensionale Arrays zu erleichtern, sollten Sie sich folgendes Beispiel anschauen:

// Array erzeugen
// Hinweis: das Array kunden enthält Elemente vom Typ Array
$kunden = array(
  array("Maier","Toni"),
  array("Müller","Fred"),
  array("Schmidt","Bernd")
);
// Wie kommen Sie nun an die Vornamen der Kunden heran?
echo $kunden[0][1]; // Ergebnis: Toni
echo $kunden[1][1]; // Ergebnis: Fred
echo $kunden[2][1]; // Ergebnis: Bernd

Was hierbei sicher auffällt, ist die besondere Struktur des Arrays $kunden. Es enthält wiederum Arrays. Jeder Kunde stellt ein eigenes Array dar, welches Elemente besitzt. Die Elemente der ungeordneten bzw. verschachtelten Arrays sind der Nachname und der Vorname des jeweiligen Kunden. Das Auslesen der Vornamen aus dem Array $kunden sollten Sie sich wie das Durchschauen von Akten vorstellen. In der ersten eckigen Klammer steht der Index des Arrays $kunden. Mithilfe des Index können Sie die einzelnen Akten einsehen. Im Beispiel haben Sie davon drei zur Auswahl. Die Akte des ersten Kunden trägt dabei den Index 0, da diese Akte im Array $kunden das erste Element symbolisiert. Sie haben nun die Akte!

In der zweiten eckigen Klammer steht der Index des untergeordneten Arrays (Akte). Mithilfe dieses Index können Sie die Elemente des untergeordneten Arrays abrufen. Es stehen sowohl der Nachname, das erste Element (Index 0), als auch der Vorname, das zweite Element (Index 1), zur Verfügung. Der Vorname des ersten Kunden trägt dabei den Index 1, da dieses Element im untergeordneten Array das zweite Element darstellt. Sie sind am Ziel! Um diese Arbeitsweise zu vertiefen, folgt ein weiteres Beispiel.

Fallbeispiel

Stellen Sie sich die Sitzplätze eines Flugzeugs vor, 40 Sitzplätze verteilt auf 10 Reihen zu je 4 Sitzplätzen. Ihre Aufgabe soll es nun sein, die Belegung dieser Sitzplätze in einem Programm zu verwalten und mithilfe von PHP umzusetzen. Hierbei bietet es sich an, die Plätze in Form eines Arrays zu verwalten.

Beispiel

// Array Erzeugen (leeres Array)
$sitze = array();

Dieser Ansatz erscheint auf den ersten Blick recht gut, nur gibt es ein Problem: Die Anordnung der Plätze ist jeweils in 10 Reihen zu je 4 Sitzplätzen aufgeteilt. In dem Array $sitze haben Sie jedoch nur die Möglichkeit, die Elemente eindimensional anzuordnen, ohne zwischen Reihen und Sitzplätzen pro Reihe zu unterscheiden. Sie merken dies vor allem dann, wenn jemand Platz 25 in Reihe 7 bucht und Sie dieses Element im Array auf true setzen wollen; true repräsentiert in diesem Fall belegt.

Geschickter ist es, jede einzelne Reihe als ein eigenes Array zu betrachten und das gesamte Flugzeug demnach als ein Array von zehn untergeordneten Arrayelementen anzusehen.

Beispiel
// For-Schleife (legt die untergeordneten Arrays fest)
for ($i = 0; $i < 10; $i++) {
  $sitze[$i] = array(0,0,0,0);
}

Wie Sie sehen, ist noch eine for-Schleife eingesetzt worden, um Ihnen das Eingeben der untergeordneten Arrays zu ersparen. Der nächste Schritt besteht darin, die Elemente für die einzelnen Sitzplätze auf false zu setzen, um anzuzeigen, dass sie nicht belegt sind. Dazu werden wir zwei verschachtelte for-Schleifen verwenden. Die äußere for-Schleife geht die Elemente im Array sitze durch, sprich die einzelnen Reihen. Die innere for-Schleife geht die einzelnen Plätze des aktuellen Reihen-Arrays durch. Auf die einzelnen Elemente greift man dann über zwei Indexangaben zu. Die erste bezeichnet die Reihe, die zweite den Platz in der Reihe.

Beispiel

// Zuweisung der Belegung (Ausgangssituation: false)
for ($reihe = 1; $reihe <= count($sitze); $reihe++) {
  for ($platz = 1; $platz <= count($sitze[$reihe-1]); $platz++) {
    $sitze[$reihe-1][$platz-1] = 0;
  }
}

Nun sollten Sie zur Probe einen Sitzplatz buchen, wie wäre es mit Sitzplatz 25 in Reihe 7, und anschließend die gesamte Belegung ausgeben lassen.

Beispiel

// Sitzplatz 25 (Reihe 7) belegen
$sitze[6][0] = "belegt";
// Ausgabe der Belegung im Ausgabefenster
for ($reihe = 1; $reihe <= count($sitze); $reihe++) {
  print_r($sitze[$reihe-1]);
}
{PSP}Beispiel vollständig

<pre>
<?php
$sitze = array();
// For-Schleife (legt die untergeordneten Arrays fest)
for ($i = 0; $i < 10; $i++) {
  $sitze[$i] = array(0,0,0,0);
}

// Zuweisung der Belegung (Ausgangssituation: false)
for ($reihe = 1; $reihe <= count($sitze); $reihe++) {
  for ($platz = 1; $platz <= count($sitze[$reihe-1]); $platz++) {
    $sitze[$reihe-1][$platz-1] = 0;
  }
}

// Sitzplatz 25 (Reihe 7) belegen
$sitze[6][0] = "belegt";
// Ausgabe der Belegung im Ausgabefenster
for ($reihe = 1; $reihe <= count($sitze); $reihe++) {
  print_r($sitze[$reihe-1]);
}
?>
</pre>

Ausgabe
Array
([0] => 0 [1] => 0 [2] => 0 [3] => 0)
Array
([0] => 0 [1] => 0 [2] => 0 [3] => 0)
Array
([0] => 0 [1] => 0 [2] => 0 [3] => 0)
Array
([0] => 0 [1] => 0 [2] => 0 [3] => 0)
Array
([0] => 0 [1] => 0 [2] => 0 [3] => 0)
Array
([0] => 0 [1] => 0 [2] => 0 [3] => 0)
Array
([0] => belegt [1] => 0 [2] => 0 [3] => 0)
Array
([0] => 0 [1] => 0 [2] => 0 [3] => 0)
Array
([0] => 0 [1] => 0 [2] => 0 [3] => 0)
Array
([0] => 0 [1] => 0 [2] => 0 [3] => 0)

Hinweis: Das in diesem Fallbeispiel eingesetzte count() wird Ihnen im Abschnitt 3.10.6 »Arrayfunktionen« noch näher erläutert.

Was Sie bisher gesehen haben, waren mehrdimensionale lineare Arrays, sprich lediglich indizierte Arrays. Wie sieht es jedoch mit assoziativen Arrays aus? Betrachten Sie folgendes Beispiel:

<?php
$personen = array(
    "P1" => array("Matthias","Kannengiesser"),
    "P2" => array("Caroline","Kannengiesser"),
    "P3" => array("Gülten","Kannengiesser"),
    "P4" => array("Toni","Schmidt")
    );
echo "Person 1: " . $personen["P1"][0] . " " . $personen["P1"][1];
?>

Ausgabe

Person 1: Matthias Kannengiesser

Wie Sie sehen, lässt sich das Prinzip der mehrdimensionalen Arrays auch auf assoziative Arrays anwenden, ja sogar eine Kombination aus indizierten und assoziativen Arrays ist ohne Weiteres möglich. Was die Ausgabe bzw. Verarbeitung der Array-Elemente betrifft, stehen Ihnen noch Alternativen in der Schreibweise zur Verfügung. Hier einige Beispiele:

// Ohne Anführungszeichen
echo "Person 1: " . $personen[P1][0] . " " . $personen[P1][1];

// Mit einfachen Anführungszeichen
echo "Person 1: " . $personen['P1'][0] . " " . $personen['P1'][1];

// Mit doppelten Anführungszeichen
echo "Person 1: " . $personen["P1"][0] . " " . $personen["P1"][1];

Natürlich können Sie auch in diesen Fällen eine Schleife verwenden, um die einzelnen Elemente des Arrays zu durchlaufen.{PSP}Beispiel

<?php
$personen = array(
    "P1" => array("Matthias","Kannengiesser"),
    "P2" => array("Caroline","Kannengiesser"),
    "P3" => array("Gülten","Kannengiesser"),
    "P4" => array("Toni","Schmidt")
    );
// Ohne Anführungszeichen
for ($i = 1; $i <= count($personen); $i++) {
  echo "Person $i: " . $personen[P.$i][0] . " " . $personen[P.$i][1] . "<br>";
}
// Mit einfachen Anführungszeichen
for ($i = 1; $i <= count($personen); $i++) {
  echo "Person $i: " . $personen['P'.$i][0] . " " . $personen['P'.$i][1] . "<br>";
}
// Mit doppelten Anführungszeichen
for ($i = 1; $i <= count($personen); $i++) {
  echo "Person $i: " . $personen["P".$i][0] . " " . $personen["P".$i][1] . "<br>";
}
?>

In sämtlichen Fällen erfolgt folgende Ausgabe:
Person 1: Matthias Kannengiesser
Person 2: Caroline Kannengiesser
Person 3: Gülten Kannengiesser
Person 4: Toni Schmidt

Sie könnten natürlich auch eine foreach-Schleife einsetzen, um das Array zu durchlaufen.

<?php
$personen = array(
    "P1" => array("Matthias","Kannengiesser"),
    "P2" => array("Caroline","Kannengiesser"),
    "P3" => array("Gülten","Kannengiesser"),
    "P4" => array("Toni","Schmidt")
    );
// Mit foreach
foreach ($personen as $wert) {
  echo "Person: " . $wert[0]. " " . $wert[1] . "<br>";
}
?>

Ausgabe
Person: Matthias Kannengiesser
Person: Caroline Kannengiesser
Person: Gülten Kannengiesser
Person: Toni Schmidt

Nun, wer die Wahl hat, hat die Qual!