Mein Array Artikel PHP Solutions

Artikel in der europäischen Fachzeitschrift PHP-Solutions

Author: Koller Michel, Geschäftsführer der Firma KWP
Ausgabe: Januar 2008

Arrays die kleinen Datenbanken

Was ist ein Array

Das Array gibt es in fast jeder Programmiersprache. Es ist eine Art Liste wo verschiedene Werte, Objekte oder auch wieder Array's unter einem Namen zusammengefasst verwaltet werden können. Ich möchte hier möglichst einfach und leicht verständlich die 3 gebräuchlichsten PHP-Arrays erläutern, ohne auf die vielen zusätzlichen Möglichkeiten einzugehen die sie bieten.

Bildlich dargestellt kann man das Array als eine Art Schrank mit durchnummerierten Schubladen sehen.

Grundsätzlich sprechen wir hier von folgenden 3 PHP Arrays:

1-einfaches Array (nummerisches Array)
2-assoziatives Array
3-mehrdimensionales Array

Einfacher Array
Das einfache Array besteht aus einer Liste von Elementen und einem nummerischen Index der die Elemente von Null an aufsteigend adressiert. Dabei ist zu beachten das die Adressierung bei 0 beginnt, also das erste Element hat die Nummer 0, das zweite Element die 1, das dritte die 2, usw.
Wir möchten als Beispiel eines einfachen Arrays die Namen einer CD-Sammlung zusammenfassen, also erzeugen wir einen Array mit dem Namen cd_sammlung, dabei setzen wir vor den zusammenfassenden Namen ein Dollarzeichen wie bei einer Variabel.

Eingabe:
$cd_sammlung=array();

Nun kann man aber auch das Array erzeugen und gleichzeitig mit den Werten füllen:

Eingabe:
$cd_sammlung=array('Nirvana','Soundgarden', 'Nickelback', 'Beatles');

Wie das fertige Array nun wirklich aussieht, kann man mit der Funktion print_r() ausgeben:

Eingabe:
print_r($cd_sammlung);

Ausgabe:
Array ( [0] => Nirvana [1] => Soundgarden [2] => Nickelback [3] => Beatles )

Wir sehen nun das fertige Array, zusammen mit der oben schon erwähnten nummerischen Adressierung in den eckigen Klammern links (dem Schlüssel) , und rechts vom Pfeil das dazugehörige Element.
Die nun zwei wichtigsten Funktionen sind bestimmt das Ausgeben und das Hinzufügen von Werten:

Wert ausgeben zB:
echo $cd_sammlung[1];
Ausgabe: Soundgarden
oder
echo $cd_sammlung[3];
Ausgabe: Beatles

Möchten wir ein weiteres Element ans Ende des Arrays anhängen so:

Wert hinzufügen:
array_push($cd_sammlung, "Abba");

Die Menge der Möglichkeiten die man nun mit so einem Array hat ist enorm, aber bevor wir uns mit den weiteren Funktionen befassen, möchte ich noch ein anderes Arrays vorstellen nämlich das assoziative Array.

Assoziative Array
Der grosse Unterschied zum oben erwähnten ist das die Adressierung, also der Schlüssel beim assoziativen Array nicht einfach eine automatisch erzeugte Nummer ist, sondern vom Programmierer selber festgelegt werden muss und somit jedem Element im Array einen eigenen Schlüssel zuweist.

Als Beispiel möchten wir nun unsere Musikbands als Schlüssel benutzen und je das Land zuweisen (assoziieren) aus welchem sie kommen.

Code:
$cd_sammlung = array ( "Nirvana" => "USA", "Soundgarden"=> "USA", "Nickelback" => "Kanada", "Beatles"    => "England");

Und auch hier können wir den fertigen Array mit print_r betrachten, und wenn wir die Ausgabe noch mit dem HTML Tag <pre> einfassen, bekommen wir eine sehr übersichtliche Ausgabe:

Eingabe:
echo "<pre>";
print_r($cd_sammlung);
echo "</pre>";

Ausgabe:
Array([Nirvana] => USA
[Soundgarden] => USA
[Nickelback] => Kanada
[Beatles] => England
)

Auch hier die zwei wichtigsten Funktionen: das Ausgeben und das Hinzufügen von Elementen,
dazu rufen wir unser Array auf und setzen in eckige Klammern den Schlüssel, in unserem Fall den Bandnamen...

Wert ausgeben:
echo $cd_sammlung[Soundgarden];                 
Ausgabe: USA
oder
echo $cd_sammlung[Beatles];                    
Ausgabe: England

Möchten wir diesem Array ein Schlüssel/Wert Paar ans Ende des Arrays hinzufügen:

Wert hinzufügen:
$cd_sammlung["Abba"]="Schweden";

Nun haben wir also schon die zwei wichtigsten Arrays kennen gelernt, was sie sind, und wie man sie erzeugt, ausliest und Elemente hinzufügt. Nun möchten wir uns kurz einigen der vielen Möglichkeiten widmen die man nun mit ihnen hat. Dabei möchten wir uns auf ein paar gebräuchliche Funktionen beschränken, da die Anzahl der Funktionen enorm ist.

foreach()
Ist eine speziell für den Array gedachte Schleife und duchläuft jede Position des Arrays wobei, Schlüssel und Wert sehr praktisch ansprechbar sind.
Beispiel:
foreach($cd_sammlung as $schluessel => $wert) { echo $schluessel ." aus ".$wert."<br>"; }

Ausgabe:
Nirvana aus USASoundgarden aus USANikelback aus KanadaBeatles aus England

Diese Funktion gibt eine sehr übersichtliche Liste der Schlüssel und deren Werte aus, gleichzeitig können sie bei jedem Durchlauf bequem bearbeitet werden.

in_array()
Prüft, ob ein Wert in einem Array existiert.

Beispiel:
echo in_array("Soundgarden", $cd_sammlung);

Resultat:
1 (wenn der Wert vorhanden ist, ansonsten wird nichts ausgegeben)

krsort()

Sortiert das Array nach Schlüsseln in umgekehrter Reihenfolge. Das ist allerdings nur eine von sehr vielen Sortierfunktionen die es gibt.
Beispiel:
krsort($cd_sammlung);

Resultat:
macht aus:
Array ( [0] => Nirvana [1] => Soundgarden [2] => Nickelback [3] => Beatles )
wird:
Array ([3] => Beatles [2] => Nickelback[1] => Soundgarden [0] => Nirvana )

sizeof()
Gibt die Menge der Elemente an die im Array vorhanden sind
Beispiel:
echo sizeof($cd_sammlung);

Resultat :
4

array_merge()
Fügt die Elemente zweier Arrays zusammen

Beispiel:
$cd_sammlung3 = array_merge($cd_sammlung1, $cd_sammlung2)

Resultat:
$cd_sammlung3 beinhaltet alle Elemente der anderen beiden Arrays.

shuffle()
Mischt die Elemete eines Arrays
Beispiel: shuffle ($cd_sammlung);Resultat : Mischt den Array zufällig durcheinander.

Nun haben wir die 2 einfachsten Arrays für PHP kennengelernt, und können uns einer weiteren Art widmen...

Mehrdimensionalen Array
Mehrdimensionale Arrays sind eigentlich nichts anderes als ineinander verschachtelte Arrays, sozusagen Arrays die wiederum Arrays beinhalten. Wir möchten hier ein kleines Beispiel machen mit 3 Dimensionen, also einen Array mit Arrays der wiederum einen Array beinhaltet. Damit möchten wir unsere CD Sammlung und einige Informationen dazu speichern können.
Als ersten CD-Titel beginnen wir mit dem Meisterwerk von Nirvana Nevermind, hier sehen wir Schritt für Schritt wie sich die Struktur erstellt:
Unser mehrdimensionaler Array soll cd_sammlung heissen:

$cd_sammlung = array ();

In diesem wird für jede CD die wir speichern möchten wiederum einen Array erzeugt mit dem Namen der CD, also in unserem Beispiel $nevermind:

$cd_sammlung = array ("nevermind" => array());

$nevermind, beinhaltet 2 Elemente, zum einen den Namen der Band und zum anderen wiederum einen Array wo die Bandmitglieder und deren Instrumente gespeichert werden:

$cd_sammlung = array ( "nevermind" => 
                          array("bandnamen" => "nirvana", 
                                   "bandmitglieder" =>array())

                          );

Wenn wir nun den Array $bandmitglieder füllen sieht die Struktur so aus:
$cd_sammlung = array("nevermind"=>array("bandnamen" => "nirvana", "bandmitglieder" =>array("krist" => "bass", "dave" => "schlagzeug", "kurt" => "vocal")));

Nun können wir das Resultat wieder mit print_r($cd_sammlung); betrachten:


Array
(
    [nevermind] => Array
        (
            [bandnamen] => nirvana
            [bandmitglieder] => Array
                (
                    [krist] => bass
                    [dave] => schlagzeug
                    [kurt] => vocal
                )
        )

Nun ist das Array erzeugt und wir können weitere CD Titel hinzufügen, in diesem Beispiel das Album help von den Beatles:

$cd_sammlung["help"]=array("bandnamen" => "beatles", "bandmitglieder" => array("paul" => "bass", "ringo" => "schlagzeug", "john" => "vocal", "george" => "gitarre"));

Nun befinden sich schon zwei Elemente in unserem Array, diesen kann man natürlich wieder mit print_r() als ganzes ausgeben, oder man ruft einfach eine einzelnes Element auf indem man mit den Schlüssel arbeitet zB :

echo "<pre>";
print_r($cd_sammlung["nevermind"]["bandmitglieder"]);
echo "</pre>";

Ausgabe:
Array
(
    [krist] =>bass
    [dave] => schlagzeug
    [kurt] => vocal
)
Einen einzelnen Wert wird man dann so bekommen:
echo $cd_sammlung["nevermind"]["bandmitglieder"]["kurt"];

Ausgabe:
vocal

So lassen sich also wenn nötig recht komplexe Datenstrukturen mit einem Array realisieren. Natürlich gibt es auch für diese Sorte wieder viele Funktionen über die man viel Tutorial schreiben könnte, das würde aber den Rahmen hier sprengen.
Unser Beispiel sollte möglichst einfach und verständlich sein, es soll die grundsätzliche Idee der Mehrdimensionalität von Arrays Näherbringen, und zum selber testen bez. anwenden motivieren. 

Array in Datei abspeichern und wiederherstellen

Eine Interessante Möglichkeit möchte ich hier aber noch kurz zeigen. Das speichern eines Arrays, das kann man entweder in eine Datenbank oder in eine Textdatei machen. Dabei gehen die gespeicherten Werte bez. Elemente nicht verloren. Dafür benutzen wir die Funktion:
serialize()

Zusammen unter anderem mit der Funktion fopen() die die Datei öffnet, und fwrite() die in die Datei schreibt, sieht der Code dann so aus:
1 $arr = fopen("array.txt", "r+b");
2 fseek($arr, 0);
3 fwrite($arr, serialize($cd_sammlung));
4 ftruncate($arr, ftell($arr));
5 fflush($arr);
6 flock($arr, LOCK_UN);
7 fclose($arr);
Später (oder vorher) soll das Array dann wieder aus der Datei gelesen werden, das geht mit der Funktion:
unserialize()

Und kann man so machen:

1 $arr = fopen("array.txt", "r+b");
2 flock($arr, LOCK_EX);
3 $cd_sammlung = unserialize(fread($arr, 50000));
Um nun mit unserem Array zu experimentieren hab ich ein kleines Übungsskript (mit diesem Beispiel), zusammen mit der Textdatei (wo das Array gespeichert wird), der CD beigelegt.

Um damit zu üben:
- lädt man beide Dateien testarray.php und die Textdatei array.txt zusammen in ein Verzeichnis auf einem Server wo PHP installiert ist. 
-der Textdatei arrays.txt muss noch Schreibrecht gegeben werden.
-dann kann man die Datei testarray.php mit einem PHP-Editor öffnen und bearbeiten.
-Das Resultat kann man dann im Browser betrachten wenn man testarray.php aufruft...

So kann man unser Array-Beispiel mit Daten füllen, die Struktur verändern, oder das Skript einfach weiter ausbauen, um sich mit dem Thema vertraut zu machen.
Die eingegeben Element im Array gehen dabei nicht verloren weil sie bei jedem Aufruf in die Textdatei gespeichert, und wiederhergestellt werden. 
So ich hoffe nun das ich mit diesem Artikel dem einen oder anderen einen kleinen Überblick zum Thema Array verschaffen konnte, wie schon erwähnt habe ich mich auf das absolut grundsätzliche begrenzt, den dieses Thema ist in seiner Vielfalt der Anwendungsmöglichkeiten genau so enorm wie praktisch und effektiv.