Mehrdimensionales Array in PHP
Wenn man in PHP in einer Variable mehrere Daten speichern möchte, kann man hierfür Arrays verwenden. Dabei wird zwischen indizierten und assoziativen Arrays unterschieden. Es gibt eine weitere Unterscheidung zwischen ein- und mehrdimensionalen Arrays. Ein eindimensionales Array ist eine Variable, die lediglich mehrere Werte enthält. Diese werden mit einem Index (indiziert) oder mit einem Key (assoziativ) versehen und je nach Typ kann man auf die enthaltenen Werte darüber zugreifen.
Ein mehrdimensionales Array ist eine Variable, die nicht nur mehrere Einzelwerte enthält. Stattdessen sind die Werte weitere Arrays. Diese können wiederum Einzelwerte oder sogar weitere Arrays mit Einzelwerten enthalten.
Die Definition eines Arrays im Array kann mit der Funktion array() bewerkstelligt werden. Innerhalb der runden Klammern trägt man nicht die Einzelwerte ein, sondern verwendet die Funktion erneut. Die Regeln für indizierte oder assoziative Arrays sind auch hier gültig. Angenommen, man möchte eine Möglichkeit, um die Wochentage (Montag, Dienstag etc.) mit der Tageszeit (morgen, vormittag etc.) zu verknüpfen. Ein mehrdimensionales, indiziertes Array könnte man wie folgt aufbauen.
$tag = array
(
// Index 0
array
(
'Montag',
'Dienstag',
'Mittwoch',
'Donnerstag',
'Freitag'
),
// Index 1
array
(
'morgen',
'vormittag',
'mittag',
'nachmittag',
'abend',
'nacht',
)
);
// Ausgabe ergibt Montagabend
echo $tag[0][0] . $tag[1][4];
Anstelle von indizierten Arrays kann man auch assoziative Arrays oder eine Mischung aus beidem verwenden. Beim folgenden Code sind die enthaltenen Arrays assoziativ, die Einzelwerte werden dagegen automatisch mit einem Index durchnummeriert.
$tag = array
(
// Key tagname
'tagname' => array
(
'Montag',
'Dienstag',
'Mittwoch',
'Donnerstag',
'Freitag'
),
// Key tageszeit
'tageszeit' => array
(
'morgen',
'vormittag',
'mittag',
'nachmittag',
'abend',
'nacht',
)
);
// Ausgabe ergibt Dienstagnacht
echo $tag['tagname'][1] . $tag['tageszeit'][5];
Ein mehrdimensionales Array lässt sich auch nur mit Keys komplett assoziativ erstellen. Ein Key kann mehrfach verwendet werden, solange sich diese nicht auf derselben Ebene in einem Array befinden. Verwendet man ein Key innerhalb einer Ebene mehrfach, überschreibt der zuletzt angegebene Wert die vorherigen. Beim folgenden Beispiel hat man sowohl beim Tagnamen, als auch bei der Tageszeit den Key 'mo'. Das ist unproblematisch, da sie sich in verschiedenen Arrays befinden. Bei den Keys für nachmittag und nacht kann dagegen nicht für beide 'na' verwendet werden, da sie im Array auf derselben Ebene sind.
$tag = array
(
'tagname' => array
(
'mo' => 'Montag',
'di' => 'Dienstag',
'mi' => 'Mittwoch',
'do' => 'Donnerstag',
'fr' => 'Freitag'
),
'tageszeit' => array
(
'mo' => 'morgen',
'vo' => 'vormittag',
'mi' => 'mittag',
'nm' => 'nachmittag',
'ab' => 'abend',
'na' => 'nacht',
)
);
// Ausgabe ergibt Freitagmorgen
echo $tag['tagname']['fr'] . $tag['tageszeit']['mo'];
Weitere Schreibweisen für mehrdimensionale Arrays
Mit der folgenden Schreibweise kann man ebenfalls mehrdimensionale Arrays mit einem automatisch durchnummerierten Index deklarieren und Werte zuweisen. Die Verschachtelung erfolgt dadurch, in dem man ein Array dem übergeordneten Array als Wert zuordnet. Hierbei ist die Reihenfolge zu beachten. Wenn man zu Beginn das untergeordnete Array als Wert zuordnen würde, würde das nicht funktionieren, da zu dem Zeitpunkt das untergeordnete Array noch nicht bekannt ist. Daher muss man zuerst die untergeordneten Arrays erstellen und diese dann dem übergeordneten Array zuordnen. Die Array-Definition zu Beginn eines jeden Arrays ist bei dieser Variante optional, sollte jedoch aus Gründen der Vollständigkeit erfolgen.
// Optionale Array-Definition
$tagname = array();
$tagname[] = 'Montag';
$tagname[] = 'Dienstag';
$tagname[] = 'Mittwoch';
$tagname[] = 'Donnerstag';
$tagname[] = 'Freitag';
// Optionale Array-Definition
$tageszeit = array();
$tageszeit[] = 'morgen';
$tageszeit[] = 'vormittag';
$tageszeit[] = 'mittag';
$tageszeit[] = 'nachmittag';
$tageszeit[] = 'abend';
$tageszeit[] = 'nacht';
// Optionale Array-Definition
$tag = array();
$tag[] = $tagname;
$tag[] = $tageszeit;
// Ausgabe ergibt Freitagmorgen
echo $tag[0][4] . $tag[1][0];
Der Index kann auch manuell vorgegeben werden. Hierbei spielt die Reihenfolge keine Rolle. Man kann außerdem eine Mischform aus indizierten und assoziativen Arrays mit Keys bilden. Die Verschachtelung erreicht man durch mehrere Angaben des Index' oder des Keys innerhalb der eckigen Klammern. Die Ebenentiefe steigt dabei von links nach rechts.
// Optionale Array-Definition
$tag = array();
// Optionale Array-Definition
$tag[0] = array();
$tag[0][0] = 'Montag';
$tag[0][1] = 'Dienstag';
$tag[0][2] = 'Mittwoch';
$tag[0][3] = 'Donnerstag';
$tag[0][4] = 'Freitag';
// Optionale Array-Definition
$tag[1] = array();
$tag[1]['mo'] = 'morgen';
$tag[1]['vo'] = 'vormittag';
$tag[1]['mi'] = 'mittag';
$tag[1]['nm'] = 'nachmittag';
$tag[1]['ab'] = 'abend';
$tag[1]['na'] = 'nacht';
// Ausgabe ergibt Mittwochmorgen
echo $tag[0][2] . $tag[1]['mo'];
Ein mehrdimensionales Array kann durch die ausschließliche Verwendung von Keys komplett assoziativ gestaltet werden.
// Optionale Array-Definition
$tag = array();
// Optionale Array-Definition
$tag['tagname'] = array();
$tag['tagname']['mo'] = 'Montag';
$tag['tagname']['di'] = 'Dienstag';
$tag['tagname']['mi'] = 'Mittwoch';
$tag['tagname']['do'] = 'Donnerstag';
$tag['tagname']['fr'] = 'Freitag';
// Optionale Array-Definition
$tag['tageszeit'] = array();
$tag['tageszeit']['mo'] = 'morgen';
$tag['tageszeit']['vo'] = 'vormittag';
$tag['tageszeit']['mi'] = 'mittag';
$tag['tageszeit']['nm'] = 'nachmittag';
$tag['tageszeit']['ab'] = 'abend';
$tag['tageszeit']['na'] = 'nacht';
// Ausgabe ergibt Mittwochmorgen
echo $tag['tagname']['mi'] . $tag['tageszeit']['mo'];
Festlegung der Datenstruktur in mehrdimensionalen Arrays
Bei den Beispielen setzt sich eine sinnvolle Ausgabe aus den Werten von zwei Arrays (Tagname/Tageszeit) zusammen. Es kann notwendig sein, eine andere Datenstruktur festzulegen. Wenn man z.B. die Namen, Vornamen und Telefonnummer von mehreren Benutzern speichern möchten, kann man die Arrays so gestalten, dass pro Benutzer ein Array gebildet wird. Der Vorteil bei dieser Variante ist die Erweiterbarkeit. Kommen neue Benutzer hinzu, braucht man nur weitere Arrays hinzuzufügen.
$benutzer = array
(
// Index 0
array
(
'Max',
'Mustermann',
'0000000000'
),
// Index 1
array
(
'Hans',
'Mustermann',
'1111111111'
)
);
// Ausgabe ergibt Max Mustermann
echo $benutzer[0][0] . ' ' . $benutzer[0][1];
Bei den gezeigten Beispielen wird die Ausgabe eines Werts mit echo manuell vorgegeben. Mit einer Schleife ist es möglich, die Ausgabeprozedur so zu gestalten, dass alle Werte innerhalb eines Arrays ausgegeben werden.