of 29/29
( KOMPENDIUM ) Einführung | Arbeitsbuch | Nachschlagewerk PHP 5 & MySQL 5 Dynamische Webanwendungen von Einstieg bis E-Commerce LUKE WELLING LAURA THOMSON Deutsche Übersetzung von Christian Alkemper und Dorothea Heiman-Reder, unter fachlicher Mitarbeit von Friedhelm Betz

PHP 5 & MySQL 5 - bilder.buecher.de · (KOMPENDIUM ) PHP 5 & MySQL 5 107 3 Arrays In diesem Kapitel erläutern wir, wie man ein wichtiges Programmierkonstrukt verwendet: Arrays. Die

  • View
    0

  • Download
    0

Embed Size (px)

Text of PHP 5 & MySQL 5 - bilder.buecher.de · (KOMPENDIUM ) PHP 5 & MySQL 5 107 3 Arrays In diesem Kapitel...

  • ( K O M P E N D I U M )Einführung | Arbeitsbuch | Nachschlagewerk

    PHP 5 & MySQL 5Dynamische Webanwendungen von Einstieg bis E-Commerce

    L U K E W E L L I N G L A U R A T H O M S O N

    Deutsche Übersetzung von Christian Alkemper und Dorothea Heiman-Reder,

    unter fachlicher Mitarbeit von Friedhelm Betz

    http://www.mut.de/main/main.asp?page=deutsch/bookdetails&ISBN=3827268095http://www.pearsoned.de

  • ( KOMPENDIUM ) PHP 5 & MySQL 5 107

    3 Arrays

    In diesem Kapitel erläutern wir, wie man ein wichtiges Programmierkonstruktverwendet: Arrays. Die in den vorherigen Kapiteln verwendeten Variablen warenskalare Variablen, die nur einen einzigen Wert speichern. Ein Array hingegen ist eineVariable, die einen Satz oder eine Abfolge von Werten aufnimmt. Ein Array kannalso mehrere Elemente enthalten, die jeweils einen einzigen Wert – z.B. einen Textoder Zahlenwerte – oder aber ein anderes Array enthalten können. Ein Array, dasandere Arrays enthält, bezeichnet man als mehrdimensionales Array.

    PHP unterstützt numerisch indizierte und assoziative Arrays. Wenn Sie bereits eineProgrammiersprache kennen, sind Sie wahrscheinlich mit numerisch indiziertenArrays vertraut; sofern Sie allerdings keine Erfahrungen mit PHP oder Perl haben,kennen Sie assoziative Arrays wohl noch nicht. Assoziative Arrays erlauben Ihnendie Verwendung von nützlicheren Werten als Index. Hier hat ein Element keineNummer als Index, sondern Wörter oder andere sinnhafte Bezeichnungen.

    In diesem Kapitel werden wir mit der Entwicklung von PHP-Anwendungen fürBob’s Auto Parts fortfahren. Dabei werden Arrays zum Einsatz kommen, umwiederkehrende Daten (z.B. Kundenbestellungen) leichter verarbeiten zu können.Gleichzeitig werden Sie erfahren, wie Sie mit kürzerem und aufgeräumteren Codeeinige der Dinge mit Dateien tun können, die Sie im vorangegangenen Kapitel bereitskennen gelernt haben.

    In diesem Kapitel werden die folgenden Schlüsselthemen behandelt:

    numerisch indizierte Arrays

    nichtnumerisch indizierte Arrays

    Array-Operatoren

    mehrdimensionale Arrays

    Sortieren von Arrays

    Array-Funktionen

  • Kapitel 3 Arrays

    ( KOMPENDIUM ) PHP 5 & MySQL 5108

    3.1 Was ist ein Array?

    Skalare Variablen haben Sie in Kapitel 1, »Ein Schnellkurs in PHP«, bereits kennengelernt. Es handelt sich dabei um eine mit einem Namen versehene Speicherstelle, in derSie einen Wert speichern können. Ein Array ist ebenfalls eine mit einem Namenversehene Speicherstelle, in der Sie aber einen Satz von Werten speichern und Skalareauf diese Weise gruppieren können.

    Bobs Produktliste wird uns in diesem Kapitel als Beispiel-Array dienen. In Abbildung3.1 sehen Sie eine Liste mit drei Produkten, die in einem Array-Format gespeichert ist.Alle drei Produkte sind in einer einzigen Variablen $products gespeichert (dieErstellung einer solchen Variable erläutern wir weiter unten).

    Nachdem Sie die Daten als Array vorliegen haben, können Sie damit eine Mengenützlicher Dinge anfangen. Mithilfe der in Kapitel 1 erläuterten Schleifenkonstruktekönnen Sie sich Arbeit sparen, indem Sie für jeden Wert im Array die gleiche Aktiondurchführen. Die gesamte Menge an Information kann als eine Einheit bewegtwerden. Auf diese Weise können Sie mit nur einer einzigen Zeile Code alle Werte imArray an eine Funktion übergeben. Zum Beispiel könnten Sie die Produktealphabetisch sortieren wollen. Um dies zu tun, übergeben Sie einfach das gesamteArray der PHP-Funktion sort().

    Die in einem Array gespeicherten Werte nennt man Elemente des Arrays. JedemArray-Element ist ein Index zugeordnet, der auch als Schlüssel (key) bezeichnet wirdund den Zugriff auf das Element ermöglicht. In den meisten Programmiersprachenhaben Arrays numerische Indizes, deren Zählung üblicherweise bei 0 oder 1 beginnt.

    Bei PHP können Sie wahlweise Zahlen oder Strings als Array-Indizes einsetzen. Siekönnen Arrays also nach Bedarf entweder traditionell numerisch indizieren oder dieElemente mit Strings verknüpfen, um die Indexbedeutungen zu signalisieren und denNutzen der Indizierung zu steigern (diesen Ansatz kennen Sie vielleicht schon, wennSie assoziative Arrays oder Maps in anderen Programmiersprachen bereits verwendethaben). Der Programmieransatz kann je nachdem, ob Sie die numerische oder einebenutzerdefinierte Indizierung verwenden, jeweils ein wenig anders aussehen.

    Wir wollen zunächst die numerisch indizierten Arrays untersuchen und danach mitden benutzerdefinierten Schlüsseln fortfahren.

    Abbildung 3.1:Bobs Produkte

    können in einemArray gespeichert

    werden. Produkt

    Reifen Öl Zündkerzen

  • Numerisch indizierte Arrays Kapitel 3

    ( KOMPENDIUM ) PHP 5 & MySQL 5 109

    3.2 Numerisch indizierte Arrays

    Numerisch indizierte Arrays werden von den meisten Programmiersprachenunterstützt. Bei PHP starten die Indizes standardmäßig bei 0 (Sie können diesenWert aber ändern).

    Numerisch indizierte Arrays initialisieren

    Um das in Abbildung 3.1 gezeigte Array zu erstellen, verwenden Sie die folgendeCodezeile:

    $products = array('Reifen', 'Öl', 'Zündkerzen');

    Dieser Code erstellt ein Array namens $products, das die drei genannten Werteenthält: 'Reifen', 'Öl' und 'Zündkerzen'. Beachten Sie, dass array() ähnlich wie echoeigentlich ein Sprachkonstrukt und keine Funktion ist.

    Abhängig von den Inhalten, die Sie für Ihr Array vorsehen, ist eine manuelleInitialisierung wie im vorangegangenen Beispiel aber nicht notwendig. Liegen dieDaten, die Sie brauchen, bereits in einem anderen Array vor, dann können Sie diesesmit dem Operator = einfach auf das neue Array kopieren.

    Wollen Sie eine aufsteigende Folge von Zahlen in einem Array speichern, dann könnenSie es mit der Funktion range() automatisch erstellen lassen. Die folgende Anweisungerstellt ein Array namens numbers mit Elementen, die die Werte 1 bis 10 haben:

    $numbers = range(1,10);

    Der Funktion range() kann man optional einen dritten Parameter übergeben, mitdem Sie die Schrittweite zwischen den Werten festlegen. Wenn Sie also ein Array mitallen ungeraden Zahlen zwischen 1 und 10 erstellen wollen, können Sie das mit derfolgenden Codezeile tun:

    $odds = range(1, 10, 2);

    Auch mit Zeichen kann die Funktion range() benutzt werden:

    $letters = range('a', 'z');

    Wenn Sie Daten in einer Datei auf der Festplatte gespeichert haben, können Sie denArray-Inhalt direkt aus der Datei laden. Wir werden uns diesem Thema imAbschnitt 3.9, »Arrays aus Dateien laden«, im Verlauf dieses Kapitels zuwenden.

    Sind die Daten für Ihr Array in einer Datenbank gespeichert, dann können Sie dieInhalte auch direkt aus dieser Datenbank laden. Diesen Prozess beschreiben wir inKapitel 11, »Aus dem Web mit PHP auf die MySQL-Datenbank zugreifen«.

  • Kapitel 3 Arrays

    ( KOMPENDIUM ) PHP 5 & MySQL 5110

    Es gibt zudem verschiedene Funktionen, um Teile aus einem Array zu extrahieren undzur Neusortierung von Arrays. Einige dieser Funktionen werden wir in Abschnitt3.10, »Andere Funktionen zur Array-Manipulation«, am Ende dieses Kapitelsuntersuchen.

    Auf Array�Inhalte zugreifen

    Um auf den Inhalt einer Variable zuzugreifen, verwenden Sie ihren Namen. Ist dieVariable ein Array, dann müssen Sie für einen Zugriff auf den Inhalt neben demVariablennamen auch noch einen Schlüssel oder Index angeben. Der Index zeigt an,auf welches Element des Arrays Sie zugreifen wollen, und wird an den Namen ineckigen Klammern angehängt.

    Um den Inhalt des Arrays $products zu verwenden, müssen Sie $products[0], $pro-ducts[1] und $products[2] eingeben.

    Standardmäßig ist Element 0 das erste Element in einem Array. In C, C++, Java undeiner Vielzahl anderer Programmiersprachen wird das gleiche Nummerierungsschemaverwendet. Wenn Sie damit allerdings nicht vertraut sind, kann es ein wenig dauern,bis Sie es verinnerlicht haben.

    Wie bei anderen Variablen ändern Sie auch die Inhalte der Array-Elemente mit demZuweisungsoperator =. Die folgende Zeile ersetzt das erste Element im Array 'Rei-fen' durch 'Sicherungen':

    $products[0] = 'Sicherungen';

    Wenn Sie dagegen am Ende eines Arrays ein neues Element 'Sicherungen' hinzufügenwollen, geben Sie die folgende Zeile ein (das Array hat danach insgesamt vierElemente):

    $products[3] = 'Sicherungen';

    Um die Inhalte anzuzeigen, verwenden Sie die folgende Zeile:

    echo "$products[0] $products[1] $products[2] $products[3]";

    Beachten Sie aber, dass Sie auch den ziemlich gewieften String-Parser von PHPdurcheinander bringen können. Wenn Probleme mit Arrays oder anderen Variablenauftreten, die bei einer Einbettung in einen String in doppelten Anführungszeichennicht korrekt interpretiert werden, können Sie die Variablen entweder außerhalb derAnführungszeichen verwenden oder die in Kapitel 4, »Manipulation von Strings undreguläre Ausdrücke«, beschriebene komplexe Syntax verwenden. Die geradeaufgeführte echo-Anweisung arbeitet zwar einwandfrei, aber in den meisten derkomplexeren Beispielen, die in diesem Kapitel noch folgen werden, werden Siefeststellen, dass sich die Variablen außerhalb der in doppelte Anführungszeichengesetzten Strings befinden.

    Wie andere PHP-Variablen müssen auch Arrays nicht im Voraus erzeugt oderinitialisiert werden. Sie werden bei der ersten Verwendung automatisch erstellt.

  • Arrays mit unterschiedichen Indizes Kapitel 3

    ( KOMPENDIUM ) PHP 5 & MySQL 5 111

    Der folgende Code erstellt das gleiche Array $products, das wir weiter oben mit derAnweisung array() angelegt haben:

    $products[0] = 'Reifen';$products[1] = 'Öl';$products[2] = 'Zündkerzen';

    Sofern $products nicht bereits existiert, erstellt die erste Zeile ein neues Array mitgenau einem Element. Die nachfolgenden Zeilen fügen diesem Array dann Wertehinzu. Wenn Sie Werte auf diese Weise ergänzen, wird die Größe des Arraysdynamisch angepasst. Eine solche dynamische Größenanpassung wird von denmeisten anderen Programmiersprachen nicht geboten.

    Mithilfe von Schleifen auf Arrays zugreifen

    Da ein Array durch eine Abfolge von Zahlen indiziert ist, können Sie seinen Inhaltproblemlos mit einer for-Schleife anzeigen:

    for ($i = 0; $i < 3; $i++) echo "$products[$i]";

    Diese Schleife erzeugt eine ähnliche Ausgabe wie der vorangegangene Code, erfordertaber weniger Tipparbeit, als wenn man für jedes Element in einem großen Array manuellden entsprechenden Code entwickeln würde. Die Möglichkeit, mithilfe einer simplenSchleife auf alle Elemente eines Arrays zugreifen zu können, ist einer der ganz großenVorteile von Arrays. Sie können auch die foreach-Schleife verwenden, die speziell fürArrays implementiert wurde. In unserem Beispiel sähe das dann wie folgt aus:

    foreach ($products as $current) echo $current.' ';

    Dieser Code speichert nacheinander jedes Element in der Variable $current undzeigt diese dann an.

    3.3 Arrays mit unterschiedichen Indizes

    Im Array $products haben Sie es PHP überlassen, jedem Element den Standardindex zugeben. Das erste hinzugefügte Element wurde zu Element 0, das zweite zu Element 1usw. PHP unterstützt aber auch Arrays, bei denen Sie jeden Wert mit einem beliebigenSchlüssel oder Index verknüpfen können.

    Ein Array initialisieren

    Der folgende Code erstellt ein Array mit Produktnamen als Schlüsseln und Preisenals Werten:

    $prices = array('Reifen'=>100, 'Öl'=>10, 'Zündkerzen'=>4);

    Das Symbol zwischen Schlüssel und Wert ist einfach ein Gleichheitszeichen, gefolgtvon einem Größer-als-Zeichen.

  • Kapitel 3 Arrays

    ( KOMPENDIUM ) PHP 5 & MySQL 5112

    Auf Array�Inhalte zugreifen

    Auch bei diesem Array erfolgt der Zugriff auf den Inhalt der Elemente über denVariablennamen und einen Schlüssel. Die im Array $prices gespeicherten Datenkönnen Sie also über $prices['Reifen'], $prices['Öl'] und $prices['Zündkerzen']ansprechen.

    Der folgende Code erzeugt das gleiche Array $prices. Anstatt ein Array mit dreiElementen einzurichten, erstellt diese Version zunächst ein Array mit nur einemElement und fügt dann zwei weitere hinzu.

    $prices = array('Reifen'=>100);$prices['Öl'] = 10;$prices['Zündkerzen'] = 4;

    Hier noch eine weitere, etwas andere, aber äquivalente Version. Das Array wirdüberhaupt nicht explizit erstellt. Es wird für Sie erzeugt, sobald Sie das erste Elementhinzufügen:

    $prices['Reifen'] = 100;$prices['Öl'] = 10;$prices['Zündkerzen'] = 4;

    Schleifen verwenden

    Da die Indizes im Array keine Zahlen sind, können Sie bei assoziativen Arrays nichteinfach einen Zähler in einer for-Schleife verwenden. Sie können allerdings die for-each-Schleife oder die Konstrukte list() oder each() verwenden.

    Die foreach-Schleife hat bei assoziativen Arrays eine leicht veränderte Struktur. Siekönnen Sie genauso wie im obigen Beispiel verwenden oder aber auch die Schlüsselin den Aufruf integrieren:

    foreach ($prices as $key => $value) { echo $key .'=>' . $value . '
    ';}

    Der folgende Code listet den Inhalt des Arrays $prices mithilfe des Konstruktseach() auf:

    while ($element = each($prices)) { echo $element['key']; echo ' - '; echo $element['value']; echo '
    ';}

    Die Ausgabe dieses Scriptfragments sehen Sie in Abbildung 3.2.

  • Arrays mit unterschiedichen Indizes Kapitel 3

    ( KOMPENDIUM ) PHP 5 & MySQL 5 113

    In Kapitel 1 haben wir while-Schleifen und die echo-Anweisung untersucht. ObigerCode verwendet die each()-Funktion, die Sie noch nicht kennen gelernt haben. DieseFunktion gibt das aktuelle Element im Array zurück und macht danach das folgendeElement zum aktuellen Element. Da Sie each() innerhalb einer while-Schleifeaufrufen, gibt es nacheinander jedes Element im Array zurück und stoppt erst, wenndas Ende des Arrays erreicht ist.

    In diesem Code ist die Variable $element ein Array. Wenn Sie each() aufrufen, gibt esIhnen ein Array mit vier Werten und den vier Indizes der Array-Positionen zurück. DieSpeicherpositionen key und 0 enthalten den Schlüssel des aktuellen Elements, diePositionen value und 1 den Wert dieses Elements. Obwohl es eigentlich keine Rollespielt, ob Sie die benannten oder nummerierten Speicherpositionen verwenden, ziehenwir in diesem Buch die benannten Varianten vor.

    Es gibt noch eine elegantere und häufiger verwendete Möglichkeit, diese Aufgabe zulösen. Das Konstrukt list() kann zur Unterteilung eines Arrays in eine Anzahl vonWerten verwendet werden. Sie können zwei der Werte, die die each()-Funktionzurückgibt, wie folgt trennen:

    list($product, $price) = each($prices);

    Abbildung 3.2:Eine each()�Anweisung kann zur schleifenbasierten Verarbeitung von Arrays verwendet werden.

  • Kapitel 3 Arrays

    ( KOMPENDIUM ) PHP 5 & MySQL 5114

    In dieser Zeile wird mithilfe von each() das aktuelle Element aus $prices aufgerufenund als Array zurückgegeben und daraufhin das nächste Element zum aktuellengemacht. Außerdem wird list() verwendet, um die Array-Elemente 0 und 1, die voneach() zurückgegeben wurden, in zwei neue Variablen namens $product und $priceumzuwandeln.

    Das folgende kleine Script ermöglicht es Ihnen, das gesamte Array $prices zuverarbeiten und die Inhalte via echo auszugeben:

    while (list($product, $price) = each($prices)) { echo "$product - $price
    ";}

    Die Ausgabe ist mit dem vorhergehenden Script identisch, aber es ist leichter zulesen, da list() Ihnen die Zuweisung von Namen an die Variablen erlaubt.

    Wenn Sie each() verwenden, beachten Sie, dass das Array sich merkt, welches dasaktuelle Element ist. Wollen Sie das gleiche Array also zweimal im gleichen Scriptverwenden, dann müssen Sie das aktuelle Element mit der Funktion reset() zurückauf den Array-Start setzen. Um das Array $prices in einer Schleife neu zu verarbeiten,geben Sie Folgendes ein:

    reset($prices);while (list($product, $price) = each($prices)) { echo "$product - $price
    ";}

    Dieser Code setzt das aktuelle Element zurück auf den Start des Arrays undermöglicht es Ihnen, das Array erneut zu durchlaufen.

    3.4 Array�Operatoren

    Es gibt eine Gruppe spezieller Operatoren, die nur für Arrays gelten. Die meistenvon ihnen haben bei den skalaren Operatoren ein entsprechendes Gegenstück. DieOperatoren sind in Tabelle 3.1 aufgeführt.

    Tabelle 3.1:Array�Operatoren

    bei PHP

    Operator Name Verwendung Ergebnis

    + Vereinigung (Union)

    $a + $b Vereinigung von $a und $b. $b wird an $a angehängt, wobei doppelte Schlüssel nicht überschrieben werden.

    == Gleichheit $a == $b Gibt TRUE zurück, wenn $a und $b die gleichen Elemente (d.h. die gleichen Schlüssel und die gleichen Werte) enthalten.

    === Identität $a === $b Gibt TRUE zurück, wenn $a und $b die gleichen Elemente (d.h. die gleichen Schlüssel und die gleichen Werte) in derselben Reihenfolge aufweisen.

  • Mehrdimensionale Arrays Kapitel 3

    ( KOMPENDIUM ) PHP 5 & MySQL 5 115

    Diese Operatoren sind weitgehend selbsterklärend, lediglich der Operator Union(Vereinigung) soll an dieser Stelle näher erläutert werden. Union versucht, dieElemente von $b an das Ende von $a anzuhängen. Haben Elemente in $b jedochdieselben Schlüssel wie bereits in $a vorhandene Elemente, dann werden sie nichthinzugefügt. Es werden somit keine Elemente in $a überschrieben.

    Sie werden feststellen, dass es zu allen Array-Operatoren in der Tabelle gleichwertigeOperatoren gibt, mit denen skalare Variablen bearbeitet werden können. Wenn Siesich merken können, dass mit + eine Addition bei den skalaren Typen und eineVereinigung bei Arrays durchgeführt wird, sollte das Verhalten dieser Operatoren –selbst wenn Sie sich nicht für die dahinter stehende Arithmetik interessieren – Sie vorkeine allzu großen Probleme stellen. Ein Vergleich von Arrays mit skalaren Typen istziemlich sinnlos.

    3.5 Mehrdimensionale Arrays

    Arrays müssen nicht aus einer einfachen Liste aus Schlüsseln und Werten bestehen,sondern jedes Element eines Arrays kann selbst ein anderes Array aufnehmen. Aufdiese Weise können Sie zweidimensionale Arrays erstellen. Ein solches zweidimen-sionales Array können Sie sich als eine Art Gitter oder Matrix mit einer Breite und einerHöhe, oder Zeilen und Spalten, vorstellen.

    Wollen Sie jeweils mehrere Angaben zu Bobs Produkten speichern, dann könnten Sieein zweidimensionales Array einsetzen. Abbildung 3.3 zeigt Bobs Produkte alszweidimensionales Array, wobei jede Zeile ein Produkt und jede Spalte ein gespei-chertes Produktattribut darstellt.

    != Ungleichheit $a != $b Gibt TRUE zurück, wenn $a und $b nicht die gleichen Elemente enthalten.

    Ungleichheit $a $b Gibt TRUE zurück, wenn $a und $b nicht gleich sind.

    !== nicht identisch

    $a !== $b Gibt TRUE zurück, wenn $a und $b nicht identisch sind.

    Operator Name Verwendung ErgebnisTabelle 3.1:Array�Operatoren bei PHP(Forts.)

    Abbildung 3.3:Sie können weitere Informationen zu Bobs Produkten in einem zweidimen�sionalen Array ablegen.

    Produktattribut

    Pro

    dukt

    Reifen

    Öl

    Zündkerzen

    100

    10

    4

    TIR

    Beschreibung PreisCode

    OIL

    SPK

  • Kapitel 3 Arrays

    ( KOMPENDIUM ) PHP 5 & MySQL 5116

    Um die Daten so im Array zu speichern, wie in Abbildung 3.3 gezeigt, verwenden Sieden folgenden Code:

    $products = array(array('TIR', 'Reifen', 100), array('OIL', 'Öl', 10), array('SPK', 'Zündkerzen', 4));

    Aus dieser Definition geht hervor, dass das Array $products nun drei weitere Arraysenthält.

    Sie erinnern sich: Um auf Daten in einem eindimensionalen Array zugreifen zukönnen, benötigen Sie den Namen des Arrays und des Index des jeweiligen Elements.Bei einem zweidimensionalen Array ist die Verfahrensweise ähnlich, nur verfügt jedesElement über zwei Indizes: eine Zeile und eine Spalte (dabei haben die oberste Zeileund die ganz links liegende Spalte jeweils den Index 0).

    Um den Inhalt des Arrays anzuzeigen, können Sie jedes einzelne Element wie folgtaufrufen:

    echo '|' . $products[0][0] . '|' . $products[0][1] . '|' . $products[0][2] . '|
    ';

    echo '|' . $products[1][0] . '|' . $products[1][1] . '|' . $products[1][2] . '|
    ';echo '|' . $products[2][0] . '|' . $products[2][1] . '|' . $products[2][2] .

    '|
    ';

    Alternativ erzielen Sie mit zwei ineinander verschachtelten for-Schleifen dengleichen Effekt:

    for ($row = 0; $row < 3; $row++) { for ($column = 0; $column < 3; $column++) { echo '|' . $products[$row][$column]; } echo '|
    ';}

    Beide Versionen dieses Codes erzeugen die gleiche Browserausgabe:

    |TIR|Reifen|100||OIL|Öl|10||SPK|Zündkerzen|4|

    Der einzige Unterschied zwischen diesen beiden Beispielen besteht darin, dass IhrCode gerade bei großen Arrays kürzer ist, wenn Sie die zweite Variante verwenden.

    Vielleicht ziehen Sie es aber vor, wie in Abbildung 3.3 Spaltennamen statt Spalten-nummern zu verwenden. Wenn Sie also die gleichen Produkte mit den in der Abbil-dung verwendeten Spaltennamen abspeichern wollen, benutzen Sie den folgendenCode:

  • Mehrdimensionale Arrays Kapitel 3

    ( KOMPENDIUM ) PHP 5 & MySQL 5 117

    $products = array(array('Code' => 'TIR', 'Beschreibung' => 'Reifen', 'Preis' => 100 ), array('Code' => 'OIL', 'Beschreibung' => 'Öl', 'Preis' => 10 ), array('Code' => 'SPK', 'Beschreibung' => 'Zündkerzen', 'Preis' => 4 ) );

    Mit diesem Array kann man beim Abfragen einzelner Werte leichter umgehen. Dassdie Produktbeschreibung in der Spalte Beschreibung gespeichert ist, lässt sich leichtermerken als eine Beschreibung in der Spalte 1. Wenn Sie solche beschreibenden Indizesverwenden, dann müssen Sie sich nicht erinnern, dass ein Element unter [x][y]gespeichert ist. Sie finden Ihre Daten schneller, indem Sie durch »sprechende« Zeilen-und Spaltennamen auf eine Speicherstelle Bezug nehmen.

    Ein Nachteil ist natürlich, dass Sie die einzelnen Spalten nicht mehr mithilfe einereinfachen for-Schleife Schritt für Schritt durchlaufen können. Hier ist eineMöglichkeit, wie man dieses Array anzeigen kann:

    for ($row = 0; $row < 3; $row++) { echo '|' . $products[$row]['Code'] . '|' . $products[$row]['Beschreibung'] . '|' . $products[$row]['Preis'] . '|
    ';}

    Sie können aber mithilfe einer Schleife das äußere, numerisch indizierte Array $pro-ducts verarbeiten. Jede Zeile im Array $products ist ein Array mit beschreibendenIndizes. Mithilfe der Funktionen each() und list() in einer while-Schleife könnenSie dann diese inneren Arrays durchlaufen. Zu diesem Zweck benötigen Sie also einewhile-Schleife innerhalb einer for-Schleife:

    for ($row = 0; $row < 3; $row++) { while (list($key, $value) = each($products[$row])) { echo "|$value"; } echo '|
    ';}

    Sie müssen übrigens nicht bei zwei Array-Dimensionen aufhören. Sie könnenvielmehr Array-Elemente erstellen, die neue Arrays enthalten, welche wiederumweitere Arrays enthalten usw.

    Ein dreidimensionales Array etwa hat eine Breite, eine Höhe und eine Tiefe. Wenn Siesich etwa ein zweidimensionales Array als Tabelle mit Zeilen oder Spalten vorstellen,dann erweitern Sie dieses Bild für dreidimensionale Arrays auf einen Stapel solcherTabellen. Jedes Element wird dann durch seine Schicht, seine Zeile und seine Spaltereferenziert.

  • Kapitel 3 Arrays

    ( KOMPENDIUM ) PHP 5 & MySQL 5118

    Wenn Bob seine Produkte in Kategorien unterteilen würde, dann könnten Sie diesein einem dreidimensionalen Array abspeichern. Abbildung 3.4 zeigt Bobs Produktein einem dreidimensionalen Array.

    Dem Code, der das Array definiert, können Sie entnehmen, dass ein dreidimensionalesArray ein Array ist, das Arrays mit Arrays enthält:

    $categories = array(array(array('CAR_TIR', 'Reifen', 100), array('CAR_OIL', 'Öl', 10), array('CAR_SPK', 'Zündkerzen', 4) ), array(array('VAN_TIR', 'Reifen', 120), array('VAN_OIL', 'Öl', 12), array('VAN_SPK', 'Zündkerzen', 5) ), array(array('TRK_TIR', 'Reifen', 150), array('TRK_OIL', 'Öl', 15), array('TRK_SPK', 'Zündkerzen', 6) ) );

    Da dieses Array nur über numerische Indizes verfügt, können Sie den Inhaltwiederum mithilfe verschachtelter for-Schleifen anzeigen:

    for ($layer = 0; $layer < 3; $layer++) { echo "Schicht $layer
    "; for ($row = 0; $row < 3; $row++) { for ($column = 0; $column < 3; $column++) { echo '|' . $categories[$layer][$row][$column]; }

    Abbildung 3.4:In diesem

    dreidimensionalenArray sind die

    Produkte inKategorienunterteilt.

    product attribute

    Tires

    Oil

    Spark Plugs

    100

    10

    4

    TLR

    Beschreibung

    Lkw-Teile

    PreisCode

    OIL

    SPK

    product attribute

    Tires

    Oil

    Spark Plugs

    100

    10

    4

    TLR

    Beschreibung

    Transporterteile

    PreisCode

    OIL

    SPK

    Produktattribut

    Pro

    dukt

    Reifen

    Öl

    Zündkerzen

    100

    10

    4

    CAR_TIR

    Beschreibung

    Kfz-Teile

    PreisCode

    CAR_OIL

    CAR_SPK

    Pro

    dukt

    kate

    gorie

  • Arrays sortieren Kapitel 3

    ( KOMPENDIUM ) PHP 5 & MySQL 5 119

    echo '|
    '; }}

    Aufgrund der Art und Weise, wie mehrdimensionale Arrays erstellt werden, könnenSie vier-, fünf- oder sogar sechsdimensionale Arrays anlegen. Von Seiten derProgrammiersprache ist die Anzahl der Dimensionen von Arrays unbeschränkt; aberdie meisten Leute werden Schwierigkeiten haben, sich Konstrukte mit mehr als dreiDimensionen vorzustellen. Die meisten Probleme lassen sich aber in der Praxisohnehin mit drei oder weniger Dimensionen abbilden.

    3.6 Arrays sortieren

    Das Sortieren von Daten in einem Array kann sich häufig als recht nützlich erweisen.Ein eindimensionales Array können Sie problemlos in die gewünschte Reihenfolgebringen.

    sort() verwenden

    Der folgende Code stellt die Funktion sort() dar. Hier wird eine einfache Sortierungin aufsteigender alphabetischer Reihenfolge erzielt:

    setlocale(LC_ALL, '[email protected]', 'de_DE', 'de', 'ge');$products = array('Reifen', 'Öl', 'Zündkerzen');sort($products, SORT_LOCALE_STRING);

    Die Array-Elemente erscheinen nun in der Reihenfolge Öl, Reifen, Zündkerzen.

    Die Angabe der Konstante SORT_LOCALE_STRING sorgt dafür, dass die Sortierung loka-lisiert nach den Einstellungen des Betriebssystems erfolgt (SystemLocale). Bei einerdeutschen Lokalisierungseinstellung wird deshalb Öl als Erstes ausgegeben, bei eng-lischer Sortierung wäre Öl das letzte Element.

    Sie können die Werte natürlich auch numerisch sortieren. Wenn Ihr Array die Preisefür Bobs Produkte enthält, können Sie diese wie folgt in aufsteigender numerischerReihenfolge sortieren:

    $prices = array(100, 10, 4);sort($prices);

    Die Preise erscheinen nun in der Reihenfolge 4, 10, 100.

    Beachten Sie, dass sort() die Groß-/Kleinschreibung unterscheidet. In der Sortierungwerden alle Großbuchstaben vor den Kleinbuchstaben verarbeitet, d.h., A ist kleinerals Z, aber Z ist kleiner als a.

  • Kapitel 3 Arrays

    ( KOMPENDIUM ) PHP 5 & MySQL 5120

    Für die Funktion gibt es einen zweiten optionalen Parameter. Sie können eine derKonstanten SORT_REGULAR (Voreinstellung), SORT_NUMERIC (numerische Sortierung)oder SORT_STRING (String-Sortierung) übergeben. Seit PHP 5.0.2 können Sie mitSORT_LOCALE_STRING die Sortierung nach der locale-Einstellung des Betriebssystemsvornehmen lassen. Die Möglichkeit zur Angabe des Sortierungstyps ist beispielsweisenützlich, wenn Sie Strings vergleichen wollen, die Zahlen enthalten. Angenommen, amAnfang zweier Strings stehen die Zahlen 2 und 12. Numerisch gesehen ist 2 weniger als12, aber der String '12' ist kleiner als der String '2'.

    Mit asort() und ksort() sortieren

    Wenn Sie zur Speicherung von Produkten und deren Preisen ein Array mit beschrei-benden Schlüsseln verwenden, benötigen Sie verschiedene Arten von Sortierfunk-tionen, um Schlüssel und zugehörige Werte bei der Sortierung zusammenzuhalten.

    Der folgende Code erstellt ein Array mit den drei Produkten und den zugehörigenPreisen und sortiert dieses Array dann nach Preisen in aufsteigender Reihenfolge:

    $prices = array('Reifen' => 100, 'Öl' => 10, 'Zündkerzen' => 4);asort($prices)

    Die Funktion asort() sortiert das Array nach dem Wert jedes Elements. Im Arraysind die Werte die Preise, die Schlüssel hingegen die Beschreibungstexte. Wollen Sieeine Sortierung nicht nach Preis, sondern nach Beschreibung vornehmen, dannkönnen Sie ksort() verwenden. Hierbei erfolgt die Sortierung nicht nach dem Wert,sondern nach dem Schlüssel. Der folgende Code hat die Sortierung der Schlüssel imArray in alphabetischer Reihenfolge (Reifen, Zündkerzen, Öl) zum Ergebnis:

    $prices = array('Reifen' => 100, 'Öl' => 10, 'Zündkerzen' => 4);ksort($prices);

    Öl wird nach dem englischen Alphabet nach Zündkerzen einsortiert, da der Buch-stabe Ö größer als Z ist. Auch hier können Sie die weiter oben erwähnte KonstanteSORT_LOCALE_STRING angeben, um auf einem deutschen System die Einordnung vonÖl vor Zündkerzen zu erreichen.

    Umgekehrte Sortierreihenfolge

    Alle drei Sortierfunktionen – sort(), asort() und ksort() – sortieren ein Array inaufsteigender Reihenfolge. Jeder dieser Funktionen ist ein Gegenstück zugeordnet,mit dem das Array in absteigender Reihenfolge sortiert werden kann. Diese»umgekehrten« Funktionen heißen rsort(), arsort() und krsort().

    Sie verwenden die umgekehrten Sortierfunktionen in exakt der gleichen Weise wie dieaufsteigenden Funktionen. Die Funktion rsort() sortiert ein eindimensionales,numerisch indiziertes Array nach Indizes, die Funktion arsort() ein eindimensionalesArray nach Elementwerten und die Funktion krsort() ein eindimensionales Arraynach Elementschlüsseln – jeweils in absteigender Reihenfolge.

  • Mehrdimensionale Arrays sortieren Kapitel 3

    ( KOMPENDIUM ) PHP 5 & MySQL 5 121

    3.7 Mehrdimensionale Arrays sortieren

    Das Sortieren von Arrays mit mehr als einer Dimension oder aber in einer anderen alsder alphabetischen bzw. numerischen Reihenfolge ist etwas komplizierter. PHP weißzwar, wie zwei Zahlen oder Text-Strings miteinander verglichen werden, aber ineinem mehrdimensionalen Array ist nun einmal jedes Element wiederum ein Array.Was PHP nun nicht weiß, ist, wie zwei Arrays miteinander zu vergleichen sind; ausdiesem Grund müssen Sie eine Vergleichsmethode entwickeln. Meistens ist dieReihenfolge etwa von Wörtern oder Zahlen klar erkennbar, aber bei komplexerenObjekten kann die Sortierung schon einmal problematisch werden.

    Benutzerdefinierte Sortierung

    Der folgende Code definiert das bereits oben verwendete zweidimensionale Array, indem die drei Produkte von Bob mit jeweils einem Code, einer Beschreibung undeiner Preisangabe abgelegt werden:

    $products = array( array('TIR', 'Reifen', 100), array('OIL', 'Öl', 10), array('SPK', 'Zündkerzen', 4));

    In welcher Reihenfolge würden die Werte erscheinen, wenn Sie dieses Array sortierenwürden? Da Sie wissen, was die Inhalte darstellen, ergeben sich mindestens zweisinnvolle Sortierreihenfolgen: Sie könnten die Produkte entweder alphabetisch nachder Beschreibung oder aber numerisch nach der Preisangabe sortieren. BeideErgebnisse können realisiert werden, aber Sie müssen die Funktion usort() verwendenund PHP damit sagen, wie die Elemente zu vergleichen sind. Zu diesem Zweck müssenSie eine eigene Vergleichsfunktion entwickeln.

    Der folgende Code sortiert das Array entsprechend der zweiten Array-Spalte – derBeschreibung – in alphabetischer Reihenfolge:

    function compare($x, $y){ if ($x[1] == $y[1]) return 0; else if ($x[1] < $y[1]) return -1; else return 1;}

    usort($products, 'compare');

    Bislang haben wir in diesem Buch eine Anzahl vordefinierter PHP-Funktionenaufgerufen. Um dieses Array zu sortieren, müssen wir jedoch selbst eine Funktiondefinieren. Wir werden das Schreiben von Funktionen in Kapitel 5, »Code wiederver-wenden und Funktionen schreiben«, detailliert beschreiben. An dieser Stelle soll aberbereits eine kurze Einführung erfolgen.

  • Kapitel 3 Arrays

    ( KOMPENDIUM ) PHP 5 & MySQL 5122

    Eine Funktion definieren Sie mit dem Schlüsselwort function. Dann müssen Sie derFunktion einen Namen geben. Dieser Name sollte erklärend sein; Sie könnten also indiesem Fall die Funktion compare() nennen. Viele Funktionen übernehmen Parameteroder Argumente. An unsere Funktion compare() müssen wir zwei Parameterübergeben, nämlich einen namens $x und einen zweiten namens $y. Der Zweck dieserFunktion besteht darin, zwei Werte entgegenzunehmen und deren Reihenfolge zubestimmen.

    In diesem Beispiel sind die Parameter $x und $y zwei der Arrays innerhalb des Haupt-Arrays und stellen jeweils ein Produkt dar. Um auf die Beschreibung des Arrays $xzuzugreifen, geben Sie $x[1] ein, denn Beschreibung ist das zweite Element in diesenArrays (wie wir uns erinnern, beginnt die Nummerierung ja mit 0). Mithilfe von $x[1]und $y[1] vergleichen Sie alle Werte von Beschreibung, die an die Funktion übergebenwerden.

    Wenn eine Funktion endet, kann sie eine Antwort an den aufrufenden Codeübermitteln. Diesen Vorgang bezeichnet man als das Zurückgeben eines Wertes.Hierzu verwenden Sie in der Funktion das Schlüsselwort return. So gibt etwa die Zeilereturn 1; den Wert 1 an den Code zurück, der die Funktion aufgerufen hat.

    Um von usort() verwendet werden zu können, muss die Funktion compare() dieParameter $x und $y vergleichen. Die Funktion muss dann 0 zurückgeben, wenn $xund $y gleich sind; ist $x kleiner als $y, dann ist ein negativer Wert zurückzugeben, ist$x größer, dann muss ein positiver Wert zurückgegeben werden. Die Funktion gibtalso je nach den übergebenen Werten von $x und $y die Ergebnisse 0, 1 oder -1 zurück.

    Die letzte Codezeile ruft dann die vordefinierte Funktion usort() mit dem zusortierenden Array ($products) und dem Namen der Vergleichsfunktion (compare())auf.

    Wenn Sie das Array in einer anderen Reihenfolge sortieren wollen, können Sieeinfach eine entsprechende Vergleichsfunktion schreiben. Um eine Sortierung nachPreis durchzuführen, müssen Sie die dritte Spalte im Array vergleichen und könnendann die folgende Vergleichsfunktion entwickeln:

    function compare($x, $y){ if ($x[2] == $y[2]) return 0; else if ($x[2] < $y[2]) return -1; else return 1;}

    usort($products, 'compare');

  • Mehrdimensionale Arrays sortieren Kapitel 3

    ( KOMPENDIUM ) PHP 5 & MySQL 5 123

    Wird usort($products, 'compare') aufgerufen, wird das Array nach Produktpreisaufsteigend sortiert.

    Das »u« in usort() steht für User (dt. Benutzer), denn diese Funktion benötigt einebenutzerdefinierte Vergleichsfunktion. Auch die Funktionen uasort() und uksort()setzen als benutzerdefinierte Varianten von asort bzw. ksort das Vorhandenseineiner solchen Funktion voraus:

    Ähnlich wie asort() wird uasort() benutzt, wenn ein assoziatives Array nachdem Elementwert sortiert werden soll. Verwenden Sie asort, wenn Ihre Werteeinfach aus Zahlen oder Text bestehen. Definieren Sie eine Vergleichsfunktion,und verwenden Sie uasort(), wenn Ihre Werte komplexere Objekte (z.B.Arrays) umfassen.

    Ähnlich wie ksort() wird uksort() benutzt, wenn ein assoziatives Array nachdem Schlüssel sortiert werden soll. Verwenden Sie ksort, wenn Ihre Schlüsseleinfach aus Zahlen oder Text bestehen. Definieren Sie eine Vergleichsfunktion,und verwenden Sie uksort(), wenn Ihre Schlüssel komplexere Objekte (z.B.Arrays) umfassen.

    Umgekehrte benutzerdefinierte Sortierung

    Für die Funktionen sort(), asort() und ksort() gibt es jeweils ein Gegenstück miteinem r im Namen, das für absteigende Sortierungen eingesetzt wird. Fürbenutzerdefinierte Sortierungen gibt es keine umgekehrten Varianten, Sie könnenaber nichtsdestoweniger ein mehrdimensionales Array in absteigender Reihenfolgesortieren. Da Sie die Vergleichsfunktion definieren, können Sie eine solcheVergleichsfunktion schreiben, die die Werte in umgekehrter Reihenfolge zurückgibt.Um also absteigend zu sortieren, muss die Funktion 1 zurückgeben, wenn $x kleinerals $y ist; ist $x größer als $y, dann muss -1 zurückgegeben werden. Ein Beispiel:

    }function reverse_compare($x, $y){ if ($x[2] == $y[2]) return 0; else if ($x[2] < $y[2]) return 1; else return -1;}

    Der Aufruf usort($products, 'reverse_compare') sortiert das Array absteigend nachPreis.

  • Kapitel 3 Arrays

    ( KOMPENDIUM ) PHP 5 & MySQL 5124

    3.8 Arrays umstellen

    Es gibt Anwendungen, bei denen Sie die Reihenfolge der Array-Elemente auf andereWeise ändern wollen. Die Funktion shuffle() ermöglicht eine Zufallssortierung,während die Funktion array_reverse() eine Kopie Ihres Arrays mit allen Elementenin umgekehrter Reihenfolge erstellt.

    shuffle() verwenden

    Bob möchte ein paar seiner Produkte auf der Startseite seiner Site präsentieren. Da dieAnzahl der von ihm angebotenen Produkte recht groß ist, sollen drei zufälligausgewählte Produkte auf der Startseite erscheinen. Dabei soll es sich bei jedemSeitenaufruf um andere Produkte handeln, damit auch wiederkehrende Besucher zumKauf animiert werden. Wenn sich nun alle seine Produkte in einem Array befinden,stellt dies überhaupt kein Problem dar.

    Listing 3.1 zeigt drei zufällig ausgewählte Bilder. Die Auswahl erfolgt durch Zufalls-sortierung des gesamten Arrays und nachfolgender Anzeige der ersten drei Elemente.

    Listing 3.1:bobs_front_page.php (Erzeugung

    einer dynamischenStartseite für Bob’sAuto Parts mithilfe

    von PHP)

    Bob's Auto Parts

    Bob's Auto Parts

    Da der Code die Bilder zufällig auswählt, werden praktisch jedes Mal, wenn Sie dieSeite laden, andere Produkte angezeigt (siehe Abbildung 3.5).

  • Arrays umstellen Kapitel 3

    ( KOMPENDIUM ) PHP 5 & MySQL 5 125

    Bei älteren PHP-Versionen musste man zunächst den Zufallszahlengenerator durchAufruf der Funktion srand() aktivieren. Dies ist aber nun nicht mehr nötig.

    Die Funktion shuffle() hat keine sehr ruhmreiche Geschichte. Bei älteren PHP-Versionen funktionierte die Neusortierung nicht besonders gut, d.h., das Ergebniskonnte nicht unbedingt als sehr zufällig bezeichnet werden. Bei Version 4.2.x wurdeunter Windows sogar überhaupt keine zufällige Sortierung durchgeführt: Als Ergebniswurde exakt das Array in unveränderter Sortierung zurückgegeben, das an shuffle()übergeben worden war. In Version 5 scheint die Funktion nun endlich wie gewünschtzu funktionieren. Wenn diese Funktion eine wichtige Rolle in Ihren Scripts spielt,sollten Sie sie auf Ihrem Server testen, bevor Sie sie in Ihren Anwendungen einsetzen.

    Da Sie nicht das vollständige Array neu sortieren müssen, erzielen Sie das gleicheErgebnis mit der Funktion array_rand().

    array_reverse() verwenden

    Die Funktion array_reverse() erstellt ausgehend von einem übergebenen Array einneues Array, das die gleichen Inhalte aufweist wie das Original-Array; diese sindjedoch in umgekehrter Reihenfolge sortiert. Es gibt beispielsweise eine Vielzahl vonMöglichkeiten zur Erstellung eines Arrays, das die Werte 10 bis 1 enthält.

    Mit range() wird normalerweise eine aufsteigende Folge erstellt, die Sie mithilfe vonarray_reverse() oder rsort() umkehren können. Alternativ können Sie mithilfeeiner for-Schleife alle Elemente nacheinander erstellen:

    Abbildung 3.5:Die Funktion shuffle() ermöglicht Ihnen die Präsentation dreier zufällig ausgewählter Produkte.

  • Kapitel 3 Arrays

    ( KOMPENDIUM ) PHP 5 & MySQL 5126

    $numbers = array();for($i = 10; $i > 0; $i--) { array_push($numbers, $i);}

    Bei der for-Schleife können Sie die absteigende Reihenfolge realisieren, indem Sieden höchsten Wert als Startwert setzen und mithilfe des Operators -- den Zähler amEnde jeder Schleife um den Wert 1 reduzieren.

    Hier können Sie ein leeres Array erstellen und dann für jedes Element die Funktionarray_push() einsetzen, um ein neues Element am Ende des Arrays hinzuzufügen.Ein Hinweis am Rande: Es gibt zu array_push() auch ein Gegenstück namensarray_pop(), das ein Element am Ende eines Arrays entfernt und zurückgibt.

    Alternativ können Sie die Funktion array_reverse() benutzen, um das mit range()erstellte Array umzukehren:

    $numbers = range(1,10);$numbers = array_reverse($numbers);

    Beachten Sie, dass array_reverse() eine geänderte Kopie des Ursprungs-Arrayszurückgibt. Benötigen Sie – wie in diesem Beispiel – das ursprüngliche Array nichtmehr, dann kopieren Sie das neue Array einfach über das Original.

    Umfassen Ihre Daten lediglich einen Bereich von Integer-Zahlen, dann können Siedas Array auch in umgekehrter Reihenfolge erstellen, indem Sie –1 als optionalenSchrittweitenparameter an range() übergeben:

    $numbers = range(10, 1, -1);

    3.9 Arrays aus Dateien laden

    In Kapitel 2, »Daten speichern und abrufen«, haben Sie gelernt, wie SieKundenbestellungen in eine Datei speichern können. Die einzelnen Zeilen in der Dateisahen dabei etwa so aus:

    15:42, 20th April 4 Reifen 1 Öl 6 Zündkerzen €434.00 22 Short St, Smalltown

    Um eine Bestellung zu bearbeiten oder auszuführen, können Sie sie wieder in einArray laden. Listing 3.2 zeigt die aktuelle Bestellungsdatei an.

    Listing 3.2:vieworders.php(Bestellungen beiBob’s Auto Partsmithilfe von PHP

    anzeigen)

  • Arrays aus Dateien laden Kapitel 3

    ( KOMPENDIUM ) PHP 5 & MySQL 5 127

    for ($i = 0; $i < $number_of_orders; $i++) { echo $orders[$i] . '
    ';}

    ?>

    Das Script erzeugt fast die gleiche Ausgabe wie Listing 2.3 im vorigen Kapitel, dieauch in Abbildung 2.4 gezeigt wurde. Diesmal verwendet das Script die Funktionfile(), die die gesamte Datei in ein Array lädt. Jede Zeile in der Datei wird zu einemArray-Element. Der Code verwendet auch die Funktion count(), um zu ermitteln,wie viele Elemente im Array vorhanden sind.

    Sie könnten außerdem jeden Abschnitt der Bestellzeilen in separate Array-Elementeladen, um die Abschnitte einzeln zu verarbeiten oder ansprechender zu formatieren.Listing 3.3 macht genau das.

    Listing 3.3:vieworders2.php (Bestellungen bei Bob’s Auto Parts mithilfe von PHP auftrennen, formatieren und anzeigen)

    Bob's Auto Parts - Kundenbestellungen

    Bob's Auto PartsKundenbestellungen

  • Kapitel 3 Arrays

    ( KOMPENDIUM ) PHP 5 & MySQL 5128

    // Alle Bestellungen ausgeben echo "$line[0] $line[1] $line[2] $line[3] $line[4] $line[5] ";}echo '';?>

    Der Code in Listing 3.3 lädt die gesamte Datei in ein Array, aber anders als in Listing3.2 verwenden Sie hier die Funktion explode(), um jede Zeile so zu unterteilen, dasssich vor der Ausgabe eine Verarbeitung und Formatierung der einzelnen Zeilen-elemente durchführen lässt. Die Ausgabe dieses Scripts sehen Sie in Abbildung 3.6.

    Der Prototyp von explode() sieht wie folgt aus:

    array explode(string separator, string string [, int limit])

    Im vorigen Kapitel haben Sie das Tabulatorzeichen als Trennzeichen bei derSpeicherung verwendet. Also rufen Sie hier explode() wie folgt auf:

    $line = explode("\t", $orders[$i]);

    Abbildung 3.6:Nach Unterteilung

    der Bestelleinträgemithilfe von

    explode() könnenSie jedes Element

    einer Bestellung ineiner eigenenTabellenzelle

    ausgeben und dieAusgabe so

    ansprechendergestalten.

  • Andere Funktionen zur Array�Manipulation Kapitel 3

    ( KOMPENDIUM ) PHP 5 & MySQL 5 129

    Dieser Code »sprengt« den übergebenen String in mehrere Teile. Dabei wird jedesTabulatorzeichen zum Trenner zwischen zwei Elementen. Der String

    "15:42, 20th April\t4 Reifen\t1 Öl\t6 Zündkerzen\t€434.00\t22 Short St, Smalltown"

    wird in die Teile »15:42, 20th April«, »4 Reifen«, »1 Öl«, »6 Zündkerzen«,»€434.00« und »22 Short St, Smalltown« unterteilt.

    Beachten Sie, dass der optionale Parameter limit verwendet werden kann, um diemaximale Anzahl zurückgegebener Teile zu beschränken.

    In diesem Beispiel findet nicht allzu viel Verarbeitung statt. Es zeigt lediglich dieAnzahl der einzelnen Artikel an und erstellt zudem einen Tabellenkopf, um zuverdeutlichen, was die einzelnen Zahlen bedeuten.

    Sie könnten auf vielerlei Art und Weise Zahlen aus Strings extrahieren. Hier könntenSie beispielsweise die Funktion intval() verwenden. Wie in Kapitel 1 erwähnt,wandelt intval() einen String in eine Integer-Zahl um. Diese Konvertierung isteinigermaßen intelligent und ignoriert bestimmte Teile, die nicht in eine Ganzzahlumgewandelt werden können (wie etwa die Beschreibung in diesem Beispiel). Imnächsten Kapitel werden Sie verschiedene Verfahren zur String-Verarbeitung kennenlernen.

    3.10 Andere Funktionen zur Array�Manipulation

    Bislang haben wir gerade einmal etwa ein halbes Dutzend Funktionen zur Behandlungvon Arrays behandelt. Es gibt jedoch eine Menge weiterer Funktionen, die hin und wie-der von Nutzen sein können und von denen wir ein paar nachfolgend beschreiben wol-len.

    Mit each(), current(), reset(), end(), next(), pos() und prev() im Array navigieren

    Wir haben weiter oben bereits erwähnt, dass jedes Array über einen internen Zeigerverfügt, der auf das jeweils aktuelle Array-Element verweist. Sie haben diesen Zeigersogar – wenn auch nur indirekt – bereits benutzt, als Sie die each()-Funktionverwendet haben. Sie können ihn aber auch direkt ansprechen und manipulieren.

    Wenn Sie ein neues Array erstellen, wird der Zeiger so initialisiert, dass er auf daserste Element im Array verweist. Wenn Sie current( $array_name) aufrufen, wirddas erste Element zurückgegeben.

    Mithilfe der Funktionen next() und each() können Sie den Zeiger um eine Stelle nachhinten verschieben. each($array_name) gibt dabei das aktuelle Element vor derVerschiebung zurück. Die Funktion next() dagegen verhält sich etwas anders: WennSie next($array_name) aufrufen, wird der Zeiger zuerst weitergesetzt, und erst dannwird das (neue) aktuelle Element zurückgegeben.

  • Kapitel 3 Arrays

    ( KOMPENDIUM ) PHP 5 & MySQL 5130

    Sie wissen bereits, dass reset() den Zeiger auf das erste Element im Arrayzurücksetzt. Ähnlich setzt end($array_name) den Zeiger auf das Ende des Arrays.Das erste bzw. das letzte Element werden bei reset() und end() zurückgegeben.

    Wenn Sie sich in umgekehrter Richtung durch ein Array bewegen wollen, verwendenSie end() und prev(). prev() ist quasi die Gegenfunktion zu next(). Hierbei wird derZeiger um eine Stelle nach hinten gesetzt, nachfolgend wird das neue aktuelleElement zurückgegeben.

    So zeigt etwa der folgende Code ein Array in umgekehrter Reihenfolge an:

    $value = end($array);while ($value) { echo "$value
    "; $value = prev($array);}

    Sie können $array beispielsweise wie folgt deklarieren:

    $array = array(1, 2, 3);

    In diesem Fall sieht die Ausgabe im Browser wie folgt aus:

    321

    Mit each(), current(), reset(), end(), next(), pos() und prev() können Sie Codeschreiben, um sich in beliebiger Richtung durch ein Array zu bewegen.

    Mit array_walk() eine beliebige Funktion auf jedes Element im Array anwenden

    Es kommt gelegentlich vor, dass man jedes Element eines Arrays auf identischeWeise verarbeiten oder modifizieren will. Genau dies können Sie mit der Funktionarray_walk() tun. Der Prototyp von array_walk() sieht wie folgt aus:

    bool array_walk(array &arr, string func, [mixed userdata])

    Ähnlich wie usort() weiter oben erwartet auch array_walk() die Deklaration einereigenen Funktion. Wie der Prototyp zeigt, erwartet array_walk() drei Parameter.Der erste Parameter arr ist das zu verarbeitende Array, und der zweite Parameterfunc ist der Name einer benutzerdefinierten Funktion, die auf alle Elemente imArray angewendet wird. Der dritte Parameter userdata ist optional. Wenn Sie ihnverwenden, wird er als Parameter an Ihre Funktion weitergeleitet. Wir werden gleichsehen, wie das funktioniert.

  • Andere Funktionen zur Array�Manipulation Kapitel 3

    ( KOMPENDIUM ) PHP 5 & MySQL 5 131

    Eine praktische benutzerdefinierte Funktion wäre etwa eine, die jedes Element miteiner bestimmten Formatierung anzeigt. Der folgende Code zeigt jedes Element ineiner neuen Zeile an, indem er die benutzerdefinierte Funktion my_print() für jedesElement von $array aufruft:

    function my_print($value){ echo "$value
    ";}array_walk($array, 'my_print');

    Die Funktion, die Sie schreiben, benötigt eine bestimmte Signatur. Für jedes Elementim Array liest array_walk Schlüssel und Wert aus und übergibt diese ggf. gemeinsammit den von Ihnen angegebenen Benutzerdaten an Ihre Funktion, die daraufhin wiefolgt aufgerufen wird:

    ihrefunktion(wert, schlüssel, benutzerdaten)

    Meistens wird Ihre Funktion nur die Werte im Array verwenden. Manchmal müssenSie aber über den Parameter benutzerdaten auch einen Parameter an Ihre Funktionübergeben. Gelegentlich wird Ihre Funktion neben den Werten auch die Schlüsselaller Elemente auslesen. Ihre Funktion kann – wie oben bei my_print() – aber auchSchlüssel und benutzerdaten schlichtweg ignorieren.

    In einem etwas komplexeren Beispiel können Sie eine Funktion schreiben, die dieWerte im Array ändert und einen Parameter anfordert. Hier ist wichtig, dass, auchwenn der Schlüssel für Ihre Funktion irrelevant ist, er trotzdem angenommenwerden muss, damit auch der dritte Parameter ausgelesen wird:

    function my_multiply(&$value, $key, $factor){ $value *= $factor;}array_walk($array, 'my_multiply', 3);

    Dieser Code definiert eine Funktion namens my_multiply(), die jedes Element miteinem angegebenen Faktor multipliziert. Sie müssen den optionalen dritten Parameterangeben, damit array_walk() etwas hat, was es der Funktion als Multiplikations-faktor übergeben kann. Da Sie den Parameter benötigen, müssen Sie die Funktionmy_multiply() so definieren, dass drei Parameter angenommen werden: der Wert einesArrays ($value), der Schlüssel des Arrays ($key) und der Parameter ($factor). Siekönnen den übergebenen Schlüssel dann aber ignorieren.

    Hingewiesen sei noch auf die Art und Weise, wie $value übergeben wird. Das & vordem Variablennamen in der Definition von my_multiply() bedeutet, dass $value alsReferenz übergeben wird – dies kann man schnell einmal übersehen. Die Übergabe perReferenz ermöglicht der Funktion die Änderung der Array-Inhalte. Wir werden dieÜbergabe per Referenz in Kapitel 5 detailliert beschreiben. Sofern Sie mit dem Begriffder Referenzierung nicht vertraut sind, soll an dieser Stelle die Anmerkung genügen,dass zur Übergabe durch Referenzierung lediglich ein & vor den Variablennamengesetzt werden muss.

  • Kapitel 3 Arrays

    ( KOMPENDIUM ) PHP 5 & MySQL 5132

    Mit count(), sizeof() und array_count_values() Elemente in einem Array zählen

    Sie haben in einem früheren Beispiel die Anzahl der Elemente in einem Array bereitsmit der Funktion count() ermittelt. Die Funktion sizeof() erfüllt exakt den gleichenZweck. Beide Funktionen geben die Anzahl der Elemente in einem Array zurück, dasihnen übergeben wurde. Wenn Sie eine normale skalare Variable an diese Funktionübergeben, erhalten Sie – logischerweise – 1 zurück, bei einem leeren Array odereiner nicht gesetzten Variable wird 0 zurückgegeben.

    Die Funktion array_count_values() ist noch komplexer. Wenn Siearray_count_values($array) aufrufen, zählt die Funktion, wie oft jeder eindeutigeWert im Array $array auftritt (man bezeichnet dies als Kardinalität des Arrays). DieFunktion gibt ein assoziatives Array mit einer Häufigkeitstabelle zurück. Dieses Arrayenthält alle eindeutigen Werte aus dem Array $array als Schlüssel. Jeder Schlüssel hateinen numerischen Wert, der angibt, wie oft der entsprechende Schlüssel in $arrayauftritt.

    Das Codebeispiel

    $array = array(4, 5, 1, 2, 3, 1, 2, 1);$ac = array_count_values($array);

    erzeugt ein Array namens $ac mit dem in Tabelle 3.2 gezeigten Inhalt.

    Tabelle 3.2:Inhalt des Arrays

    $ac

    Dieses Ergebnis zeigt an, dass die Schlüssel 4, 5 und 3 in $array je einmal, derSchlüssel 1 dreimal und der Schlüssel 2 zweimal auftreten.

    Mit extract() Arrays in skalare Variablen konvertieren

    Ein nichtnumerisch indiziertes Array mit einer Anzahl von Schlüssel-Werte-Paarenkönnen Sie mit der Funktion extract() in einen Satz von skalaren Variablenkonvertieren. Der Prototyp von extract() sieht wie folgt aus:

    int extract(array var_array [, int extract_type] [, string prefix] );

    Der Zweck von extract() besteht darin, aus den Namen der Schlüssel eines Arraysskalare Variablen zu erstellen. Diesen Variablen werden dann die Werte im Array alsWerte zugewiesen.

    Schlüssel Wert

    4 1

    5 1

    1 3

    2 2

    3 1

  • Andere Funktionen zur Array�Manipulation Kapitel 3

    ( KOMPENDIUM ) PHP 5 & MySQL 5 133

    Hier ein einfaches Beispiel:

    $array = array('key1' => 'value1', 'key2' => 'value2', 'key3' => 'value3');extract($array);echo "$key1 $key2 $key3";

    Dieser Code erzeugt folgende Ausgabe:

    value1 value2 value3

    Das Array besteht aus drei Elementen mit den Schlüsseln key1, key2 und key3. Mitextract() erstellen Sie daraus die drei skalaren Variablen $key1, $key2 und $key3.Aus der Ausgabe wird ersichtlich, dass 'value1', 'value2' und 'value3' als Wertefür $key1, $key2 und $key3 definiert wurden. Diese Werte stammen aus demursprünglichen Array.

    Die Funktion extract() hat zwei optionale Parameter: extract_type und prefix. DieVariable extract_type signalisiert extract(), wie beim Auftreten von Kollisionen zuverfahren ist. Kollisionen sind Fälle, bei denen eine Variable mit dem gleichen Namenwie der Schlüssel bereits vorhanden ist. Als Vorgabe wird die vorhandene Variableüberschrieben. Die möglichen Werte für extract_type sind in Tabelle 3.3 gezeigt.

    Tabelle 3.3:Zulässige extract_type�Parameter für die Funktion extract()

    Typ Bedeutung

    EXTR_OVERWRITE Überschreibt die vorhandene Variable, wenn eine Kollision auftritt.

    EXTR_SKIP Überspringt das Element beim Auftreten einer Kollision.

    EXTR_PREFIX_SAME Erstellt beim Auftreten einer Kollision eine Variable namens $prefix_key. Hier müssen Sie zuvor prefix angegeben haben.

    EXTR_PREFIX_ALL Setzt prefix vor alle Variablennamen. Hier müssen Sie zuvor prefix angegeben haben.

    EXTR_PREFIX_INVALID Setzt prefix vor Variablennamen, die andernfalls ungültig wären (z.B. numerische Variablennamen). Hier müssen Sie zuvor prefix angegeben haben.

    EXTR_IF_EXISTS Extrahiert nur Variablen, die bereits vorhanden sind (d.h. existierenden Variablen werden die Werte aus dem Array zugewiesen). Dieser Parameter wurde in Version 4.2.0 hinzugefügt und ist praktisch, um etwa $_REQUEST in einen Satz gültiger Variablen umzuwandeln.

    EXTR_PREFIX_IF_EXISTS Erstellt nur dann eine mit Präfix versehene Version, wenn eine Version ohne Präfix bereits vorhanden ist. Dieser Parameter wurde in Version 4.2.0 hinzugefügt.

    EXTR_REFS Extrahiert Variablen als Referenzen. Dieser Parameter wurde in Version 4.3.0 hinzugefügt.

  • Kapitel 3 Arrays

    ( KOMPENDIUM ) PHP 5 & MySQL 5134

    Die beiden praktischsten Optionen sind EXTR_OVERWRITE (Voreinstellung) undEXTR_PREFIX_ALL. Die übrigen Optionen können gelegentlich nützlich sein, wenn Siewissen, dass eine bestimmte Kollision auftreten wird, und wollen, dass der Schlüsselübersprungen oder mit einem Präfix versehen wird. Hier folgt ein einfaches Beispielfür die Verwendung von EXTR_PREFIX_ALL. Wie Sie sehen, erhalten die erstelltenVariablen jeweils den Namen prefix_schlüsselname:

    $array = array('key1' => 'value1', 'key2' => 'value2', 'key3' => 'value3');extract($array, EXTR_PREFIX_ALL, 'my_prefix');echo "$my_prefix_key1 $my_prefix_key2 $my_prefix_key3";

    Dieser Code erzeugt erneut folgende Ausgabe:

    value1 value2 value3

    Damit extract() ein Element extrahieren kann, muss dessen Schlüssel ein gültigerVariablenname sein. Das heißt, Schlüssel, deren Namen mit Ziffern beginnen oderdie Leerzeichen enthalten, werden übersprungen.

    3.11 Tipps zum Weiterlesen

    In diesem Kapitel haben wir Ihnen alles erläutert, was wir für im Zusammenhang mitden Array-Funktionen von PHP für wissenswert halten. Wir haben allerdings nichtalle Array-Funktionen beschrieben, die es gibt. Alle Funktionen sind im PHP-Online-Handbuch unter http://www.php.net/array kurz skizziert.

    3.12 Ausblick

    Im nächsten Kapitel werden Sie die String-Verarbeitungsfunktionen kennen lernen.Wir werden Funktionen behandeln, mit denen Sie Strings suchen, ersetzen, trennen undzusammenfügen können. Ferner werden wir die mächtigen Funktionen für reguläreAusdrücke erklären, mit Hilfe derer Sie alle möglichen Operationen auf Strings vor-nehmen können.

    http://www.php.net/array

    PHP 5 & MySQL 5 - Dynamische Webanwendungen von Einstieg bis E-CommerceTeil 1 PHP einsetzen3 Arrays3.1 Was ist ein Array?3.2 Numerisch indizierte ArraysNumerisch indizierte Arrays initialisierenAuf Array-Inhalte zugreifen

    3.3 Arrays mit unterschiedichen IndizesEin Array initialisierenAuf Array-Inhalte zugreifen

    3.4 Array-Operatoren3.5 Mehrdimensionale Arrays3.6 Arrays sortierensort() verwendenMit asort() und ksort() sortierenUmgekehrte Sortierreihenfolge

    3.7 Mehrdimensionale Arrays sortierenBenutzerdefinierte SortierungUmgekehrte benutzerdefinierte Sortierung

    3.8 Arrays umstellenshuffle() verwendenarray_reverse() verwenden

    3.9 Arrays aus Dateien laden3.10 Andere Funktionen zur Array-ManipulationMit each(), current(), reset(), end(), next(), pos() und prev() im Array navigierenMit array_walk() eine beliebige Funktion auf jedes Element im Array anwendenMit count(), sizeof() und array_count_values() Elemente in einem Array zählenMit extract() Arrays in skalare Variablen konvertieren

    3.11 Tipps zum Weiterlesen3.12 Ausblick

    Ins Internet: Weitere Infos zum Buch, Downloads, etc.