PHP-Programmierung (Assoziative Arrays)

Weiter mit den Arrays

Im letzten Artikel lernten Sie eine Einführung in die Felder kennen. Jetzt ist es an der Zeit auf die auch bei versierten Programmieren oftmals unbekannten assoziativen Arrays einzugehen.

Assoziativer Array

Sie haben die Komponenten eines Feldes kennen gelernt. Jetzt werden wir diese Komponente – also den Schlüssel des Arrays – verallgemeinern und keine fortlaufenden Zahlen benutzen, sondern Namenwerte:
Wir definieren:

$Person[‚P001‘] = „Hugo Hase“;
$Person[‚P002‘] = „Luise Müller“;
$Person[‚P010‘] = „Aderlbert Schulze“;

Sie sehen, hier sind die Elemente des Array nicht eine nichts sagende Zahl, sondern hier z.B. eine alphanumerische Personalnummer!
Oder um es von Anfang an als Array zu definieren:

$Person = array(‚P001‘ => „Hugo Hase“,
       ‚P002‘ => „Luise Müller“,
       ‚P010‘ => „Aderlbert Schulze“);

Bitte achten Sie hier auf die Kommata und die Strichpunkte! Schnell hat man hier einen Fehler gemacht. Alle Komponenten werden mit Komma getrennt und sind ab array geklammert.
Sie werden im nächsten Artikel an einem Beispiel aus der Praxis die Vorteile der assoziativen Array noch kennen lernen.

Ihnen kommt diese Definition ungünstig vor? Nun, da sind Sie nicht alleine! Auch ich hatte zunächst nicht gleich erkannt, was der Vorteil dieser Arrays ist. Doch machen wir hier ein Beispiel mit dem Feld $Person! Wir wollen alle Personen ausgeben! Dazu müssen wir über den ganzen Array „schleifen“ und eine Ausgabe machen.
Also eine Schleife bauen. Dazu gehört Anfang und Ende der Schleife – zumindest aber die Anzahl der Elemente im Array, oder?
PHP wäre nicht PHP, wenn es hier nicht eine einfache Lösung gäbe:

foreach ($Person as $keyname => $value) {
   print(„Personalnummer=“.$keyname.“ Name=“.$value);
}

Mit einer foreach-Schleife, wird eine Schleife über alle Elemente des Arrays definiert. Um nicht mit irgendwelchen Indizes arbeiten zu müssen, kann man für jede Komponente (Schlüsselwert)
die Variable $keyname benutzen und für den angesprochenen Elementwert die Variable $value! Natürlich könnten Sie auch $i1 oder $i2 als Variablen definieren, wichtig ist nur, dass nach as eine Schlüsselwert kommt und mit => ein Variablenname für den Wert der Komponente.

Jetzt stellen Sie sich vor, dass Sie hundert Elemente der zweihundert Elemente in $Person haben, dann ist die Anzahl wie viele Elemente im Array sind, eigentlich irrelevant.

Der Nachteil ist aber, dass Sie nur die Schlüsselwerte in dem Array haben keine Komponetenzahlen – also kein $Person[1] !
Sie können aber einen assoziativen Array in einen normalen umwandeln, indem sie die entsprechenden Array-Funktionen von PHP anwenden. Denn oft braucht man halt auch den „numerierten“ Array, trotz des assoziativen Arrays.

Doch zuvor schauen wir uns noch mehrdimensionale Array an:
Einen einfachen mehrdimensionalen Array – z.B. eine Matrix kann man wie folgt definieren:

$MyPerson[0][0] = „Hugo“; $MyPerson[0][1] = „Hase“;
$MyPerson[1][0] = „Luise“; $MyPerson[1][1] = „Müller“;

Im Falle des assoziativen Arrays können wir Komponenten mit Vorname und Nachname bauen:

$MyPerson[‚P001‘][‚vorname‘] = „Hugo“; $MyPerson[‚P001′][’nachname‘] = „Hase“;
$MyPerson[‚P002‘][‚vorname‘] = „Luise“; $MyPerson[‚P001′][’nachname‘] = „Müller“;

Werden wir ein wenig praxisnäher, dann werden von sog. Schnittstellenprogrammen wie die Anbindung zur Datenbank Funktionen aufgerufen, die einen assoziativen Array zurückgegeben.
Im Falle von einer MySQL-Datenbank werden alle Sätze aus der Datenbank mit dem Aufruf mysql_fetch_array($sql_result, MYSQL_ASSOC); im Feld $db_record als assoziativ Array zurückgegeben. Es wird immer nur ein Array zurückgegeben. Somit können wir unsere Datenbank mit folgenden Aufrufen auslesen:

$sql = „SELECT * FROM personaldb“;
$sql_result = mysql_query($sql, $connect);
while ($myRecord = mysql_fetch_array($sql_result,MYSQL_ASSOC)) {
  $pnr = $myRecord[‚pnr‘];
  $MyPersonal[$pnr][‚persnr‘] = $myRecord[‚pnr‘];
  $MyPersonal[$pnr][‚vorname‘] = $myRecord[‚vorname‘];
  $MyPersonal[$pnr][’nachname‘] = $myRecord[’nachname‘];
}

Sie stellen sich also innerhalb der while-Schleife einen assoziativen Array zusammen, der alle Komponenten besitzt, die Variablennamen können Sie selbst wählen. Sie sind also nicht auf die Namen in der Datenbank angewiesen [obwohl es der Übersichtlichkeit dient, die gleichen Namen wie in der Datenbank zu benutzen]. Hier wird mit $MyPersonal[$pnr][‚persnr‘] auch ein Feld definiert, dass nur der Vollständigkeit im Array steht.

Array Funktionen

Es gibt in PHP viele viele Array-Funktionen, die sich auf die einzelnen Arten des Array beziehen. Ich möchte hier nicht alle aufzählen und erklären, Sie werden sich alle sowie so nicht merken können. Hier aber einen Link zu den existierenden Array-Funktionen http://de3.php.net/manual/de/

Um es vorwegzunehmen, es ist ziemlich schwierig diese Masse an Funktionen zu verstehen. Deshalb will ich Ihnen eine wichtige Funktion mit auf den Weg geben:
Mit diesem Beispielprogrammauszug können Sie sich die erzeugten Arrays immer anschauen.
Um eine Ausgabe eines Arrays zu definieren, schreiben Sie folgendes Programmstück:

print(„<br>Personal=<pre>“);
var_dump($MyPersonal);
print(„</pre><br>“);

Durch var_dump() wird die Belegung des gesamten angegebenen Array oder Teile davon ausgegeben, die in etwa folgendermaßen aussieht:

Personal=
array(2) {
  [„P001“]=>
  array(2) {
   [„vorname“]=>
   string(4) „Hugo“
   [„nachname“]=>
   string(4) „Hase“
  }
  [„P002“]=>
  array(2) {
   [„vorname“]=>
   string(5) „Luise“
   [„nachname“]=>
   string(11) „Müller“
  }
}

Sie erhalten alle Informationen über den obigen Array! Probieren Sie einfach drauf los!
Und noch einen Tipp: Wenn Sie das Programm beenden wollen, rufen Sie die Funktion die() auf, sie beendet das Programm sofort.

Hier noch einige wenige ausgewählten Array-Funktionen:
Mit unset($MyPersonal[‚P001‘][‚vorname‘]) können Sie ein Element des Arrays löschen.
Mit $MyPersonal = array(); löschen Sie den ganzen Array
Wir werden im Weiteren noch einige weitere Arrayfunktionen kennenlernen.
Wandeln wir zum Schluss noch den assoziativen Array in eine 2 dimensionale Matrix mit Persnr Vorname Nachname um:

$i = 0;
while($ma = each($myPersonal)) {
  $aMyPersonal[$i][0] = $ma[‚key‘];
  $aMyPersonal[$i][1] = $ma[‚value‘][‚vorname‘];
  $aMyPersonal[$i][2] = $ma[‚value‘][’nachname‘]; $i++;
}

Mit der Array-Funktion each werden alle Elemente des assoziativen Arrays aufgeschlüsselt in die Werte $ma[‚key‘] und $ma[‚value‘]. Da hier aber die Werte selbst ein Array bilden – nämlich gebildet aus vorname und nachname, ist $ma[‚value‘] ebenfalls ein Array und muss mit den Elementen angehängt werden. Würde in dem Programm $aMyPersonal[$i][1] = $ma[‚value‘] geschrieben, dann wäre $aMyPersonal[$i][1] selbst ein Array!

Schwierig, nicht wahr? Aber nur Mut! Mit der Funktion var_dump() werden Sie sich das alles klarmachen können. Ich werde auf derartige Umwandlungen noch eingehen müssen!

Gruß
Bernd Klüppelberg

Bisher gibt es keinen Kommentar. Schreiben Sie einen Kommentar!

Schreibe einen Kommentar