phpBuddy

Folge phpBuddy.eu auf Twitter

Ab sofort können alle Twitter-Begeisterte sich auch über die Aktivitäten von phpBuddy.eu auf Twitter informieren. Ich werde dort in unregelmäßigen Abständen über neue Artikel, Tutorials, Kurztipps, lesenswerte Forumeinträge oder schlicht interessante PHP Funktionen informieren.

Sie sind hier: Startseite Quick Tip Index Selten genutzte Array Funktionen
Selten genutzte Array Funktionen

Selten genutzte aber sehr nützliche Array Funktionen

In diesem Quick Tip möchte ich euch 3 Array Funktionen vorstellen, die relativ unbekannt aber dennoch sehr nützlich sind. Den Anfang macht …


array_map()

Die Funktion array_map ist ausgesprochen praktisch, wenn man eine bestimmte Aktion auf alle Array Elemente anwenden möchte. Einige haben vielleicht schon in meinen anderen Tutorials und Scripts gesehen, dass ich diese Funktion häufig in Verbindung mit Formularen auf das $_POST Array anwende um z.B. Magic_Quotes oder unnötige Leerzeichen zu entfernen.
array_map() erwartet mindestens 2 Parameter. Parameter 1 ist der Name der Callback Funktion, die auf die Array Elemente angewendet werden soll. Paramater 2 ist das Array, auf das die Callback Funktion angewendet wird. Der 3. optionale Parameter dient zur Übergabe von Parametern an die Callback Funktion.
Hier ein einfaches Codebeispiel:

$array_map = array
(
    "name"     => "andreas",
    "nickname" => "phpbuddy",
    "beruf"    => "webentwickler",
);
 
$array_map = array_map( "strtoupper", $array_map );

In diesem Beispiel wird das Array $array_map an die PHP-interne Funktion strtoupper, die alle Buchstaben in Großbuchstaben umwandelt, übergeben. Anschließend wird die Funktion auf alle Array Elemente angewandt und das Array mit den veränderten Werten zurückgeliefert. Die Ausgabe mit print_r sieht wie folgt aus:

Array
(
    [name] => ANDREAS
    [nickname] => PHPBUDDY
    [beruf] => WEBENTWICKLER
)

Wann immer man also eine Funktion auf alle Elemente eines Array anwenden muss/möchte, braucht man das nicht umständlich per foreach-Schleife machen, sondern kann sich einfach der Funktion array_map() bedienen.

Es gibt noch eine ähnlich arbeitende Funktion, die sich array_walk nennt. Der grundlegende Unterschied zwischen diesen beiden Funktionen ist, dass array_walk je nach Status TRUE oder FALSE zurück liefert, während array_map ein Array mit den veränderten Werten zurück liefert. Man kann also das ursprüngliche Array in seiner Rohform erhalten.


natsort() / natcasesort()

Die Funktion natsort steht für natural sort und dient der natürlichen Sortierung von Array Elementen. Schauen wir uns mal ein Beispiel an, dann wird deutlicher was damit gemeint ist. Als Ausgang verwenden wir folgendes Array:

$natsort = array
(
    "bild17.jpg",
    "bild2.jpg",
    "bild24.jpg",
    "bild3.jpg",
    "bild1.jpg",
);

Wir haben also eine Liste mit Bildern, die anhand ihrer fortlaufenden Zahl sortiert werden sollen. So ein Array könnte man z.B. erhalten, wenn man ein Bilder-Verzeichnis mit glob ausliest. Wendet man nun die übliche bekannte Sortierfunktion sort auf das Array an, sieht die Ausgabe wie folgt aus:

sort( $natsort );
echo '<pre>' . print_r( $natsort, TRUE ) . '</pre>';
/* Ausgabe mit normaler Sortierung
Array
(
    [0] => bild1.jpg
    [1] => bild17.jpg
    [2] => bild2.jpg
    [3] => bild24.jpg
    [4] => bild3.jpg
)
*/

Wie sofort zu erkennen ist, folgt auf bild1 nicht bild2, sondern bild17 und erst dann bild2. Ist ja auch "logisch", denn die Eins in 17 kommt vor der Zwei. ;-). Logisch ist das für die Maschine, aber die für Menschen logische Reihenfolge sieht anders aus. Diese erhalten wir mit der natürlichen Sortierung:

natsort( $natsort );
echo '<pre>' . print_r( $natsort, TRUE ) . '</pre>';
/* Ausgabe mit natürlicher Sortierung
Array
(
    [0] => bild1.jpg
    [2] => bild2.jpg
    [4] => bild3.jpg
    [1] => bild17.jpg
    [3] => bild24.jpg
)
*/

Das sieht doch schon viel besser aus. Analog zu natsort sortiert natcasesort ebenfalls natürlich, berücksichtigt dabei aber die Groß-/Kleinschreibung nicht.


Array Union - mehrere Arrays zu einem verknüpfen

Union ist der englische Begriff für Vereinigung. Man führt also 1 oder mehrere Elemente, in unsewrem Fall ganze Arrays, zusammen. Auch im Umgang mit MySQL Datenbank begegnet man hin und wieder einer UNION. Bei MySQL dient UNION der vertikalen Verknüpfung von Tabellen, im Gegensatz zu den verschiedenen Varianten von JOIN, die Tabellen horizontal verknüpfen. Das ist aber ein anderes Thema, deswegen kehren wir besser wieder zu den Arrays zurück.

Um mehrere Arrays miteinander zu verknüpfen, wird meistens die am hinlänglichsten bekannte Funktion array_merge verwendet. In den meisten Fällen kommt man damit ohne Probleme an's Ziel, aber es gibt verschiedene "Haken" mit dieser Funktion. So wird bei array_merge etwa der Index neu geschrieben, wodurch sich eine andere Nummerierung der Elemente ergeben kann. Desweiteren werden Werte mit identischen Array-Schlüssel einfach überschrieben - es gehen also Informationen verloren. Schauen wir uns mal ein Beispiel an:

$union_a = array
(
    3 => "blau",
    4 => "rot",
    7 => "gruen",
);
 
$union_b = array
(
    6 => "gelb",
    9 => "orange",
);

Wir haben also 2 Arrays, die zu einem Array verschmolzen werden sollen. Machen wir das mit array_merge, sieht das neue Array wie folgt aus:

$ergebnis_a = array_merge( $union_a, $union_b );
echo '<pre>' . print_r( $ergebnis_a, TRUE ) . '</pre>';
/* Ausgabe von Array Union mit array_merge
Array
(
    [0] => blau
    [1] => rot
    [2] => gruen
    [3] => gelb
    [4] => orange
)
*/

Man beachte die neue Indexierung im neu entstandenen Array. Das kann unerwünschte Nebeneffekte bei der Ausgabe von Arrays haben. Schauen wir uns einmal eine Methode an Arrays zu verknüpfen, die nur sehr wenig bekannt ist:

$ergebnis_b = $union_a + $union_b;
echo '<pre>' . print_r( $ergebnis_b, TRUE ) . '</pre>';
/* Ausgabe von Array Union mit dem + Operator
Array
(
    [3] => blau
    [4] => rot
    [7] => gruen
    [6] => gelb
    [9] => orange
)
*/

Ja das ist richtig, man kann sogar Arrays mit dem Array Operator Plus (+) verknüpfen. Wie auch hier deutlich zu sehen ist, bleiben die Array Schlüssel intakt und werden nicht geändert. Ein weiterer Vorteil dieser Methode ist, dass Array Elemente mit identischen Schlüsseln nicht überschrieben werden, sondern sie werden einfach übersprungen. Um die Reihenfolge der Union (Verknüpfung) zu ändern, also um das zweite Array vor das erste Array zu setzen, ändert man einfach die Reihenfolge der Arrays die mit + verknüpft werden:

$ergebnis_c = $union_b + $union_a;
echo '<pre>' . print_r( $ergebnis_c, TRUE ) . '</pre>';
/* Ausgabe von Array Union mit dem + Operator
 * bei der das Array B vor dem Array A eingefügt wurde
Array
(
    [6] => gelb
    [9] => orange
    [3] => blau
    [4] => rot
    [7] => gruen
)
*/

Bis zum nächsten Quick Tip,
Andreas


Eine live Demo und den vollständigen Code findest Du auf der phpBuddy.eu Demo Seite.