[PHP] Teile aus Array extrahieren

BF1942 Freak

Cadet 4th Year
Registriert
Mai 2005
Beiträge
73
hallo!

wie kann ich alle elemente eines array extrahieren, die einem bestimmten regex entsprechen?
also zum beispiel hab ich ein array $all. darin ist jetzt alles mögliche gespeichert. und jetzt möchte ich mir ein neues array erstellen, in dem nur die elemente drin sind, die auf den regex "\.(jpg|jpeg|gif|png|bmp)$" passen.

alternativ könnt ich natürlich auch alle, die nicht diesem regex entsprechen, aus dem array $all löschen.

es geht halt darum, das ein verzeichnis ausgelesen wird, aber nur alle bilder im array sein sollen, nicht etwa ordner oder html dateien oder sonstwas...
 
Bspw. mit array_filter():
PHP:
$images = array_filter(
  $all,
  create_function('$a', 'return preg_match("/\.(?:jpg|jpeg|gif|png|bmp)$/i", $a);')
);

Sinnvoller wäre es allerdings, wenn du beim Auslesen des Verzeichnisses nur jene Dateien ins Array packst, die dem Muster entsprechen, sofern die restlichen Dateien nicht gebraucht werden.

greetings, Keita
 
du kannst mit einer "foreach" schleife alle elemente eines arrays durchgehen. mit der funktion "preg_match" kannst du überprüfen, ob ein bestimmter regulärer ausdruck auf ein element passt, dann nur noch mit "if" sagen, dass wenns nicht passt, er das element löschen soll.

argh zu spät, keitas methode ist übrigens auch die elegantere
 
Sinnvoller wäre es allerdings, wenn du beim Auslesen des Verzeichnisses nur jene Dateien ins Array packst, die dem Muster entsprechen, sofern die restlichen Dateien nicht gebraucht werden.
Wie mache ich das? bis jetzt verwende ich scandir()

edit: und was macht das ?: im regex?

edit2: danach ist der erste index des arrays dann ja bspw. 3 und nicht mehr 0. gibts ne funktion, die die indizes auch "neumacht"?

ich machs zur zeit so:

PHP:
foreach ($all as $value)
{
    $all_images[] = $value;
}

aber das geht bestimmt eleganter, oder? viellicht sogar mit spezieller funktion..
 
Zuletzt bearbeitet:
Bei scandir() hast du natürlich das Problem, daß du gar keinen Einfluß darauf hast, welche Nodes eingelesen werden, in diesem Fall bleibt dir in der Tat nur der o.g. Weg. Die "klassische" Vorgehensweise wäre ein Verzeichnis mittels dir() zu öffnen und jeden Node einzeln einzulesen, alternativ käme je nach Anwendungsfall auch glob() in Frage.

Das ?: im regulären Ausdruck steht für "grouping", d.h. (?:pattern) nutzt die runden Klammern anders als bei (pattern) dazu ihren "Inhalt" zu gruppieren, letztere gruppiert zwar auch, speichert aber die Treffer zusätzlich für spätere Zugriffe (backtracking).

Reindizieren kannst du ein Array mittels array_values(), die funktion liefert die Werte eines Arrays als numerisches Array, der Index beginnt wie gehabt bei 0:
PHP:
$all = array_values($all);

greetings, Keita
 
Zurück
Oben