array_filter - Rückgabewert in Funktion bearbeiten

tombe

Erfahrenes Mitglied
Hallo an alle,

ich bin gerade dabei ein Suchformular zu erstellen.
Hier gibt es ein Textfeld in welches die Suchbegriffe durch Komma getrennt eingegeben werden. Wobei Wörter die kürzer als 3 Zeichen sind nicht berücksichtigt werden sollen.

Die Begriffe werden mit explode in ein Array aufgeteilt und dann sollen mit array_filter die zu kurzen Worte gelöscht werden.


PHP:
$suchbegriff = explode(",", $_POST["suche"]);
$suchbegriff = array_filter($suchbegriff, "len_suche");

var_dump($suchbegriff);

function len_suche($begriff) {
//so sollte es eigentlich sein damit Leerzeichen keine falsche Länge verursachen
	$begriff = trim($begriff);

	if (strlen($begriff) < 3) {
		return false;
	} else {
		return trim($begriff);
	}
}

Wenn ich jetzt eingebe "Hund, Katze, xy" wird "xy" zwar herausgefiltert aber bei Katze bleibt das führende Leerzeichen stehen und bei var_dump mit einer Länge von 6 Zeichen angegeben.

Jetzt die zwei Fragen:
Warum wird "xy" gefiltert wo doch mit dem Leerzeichen die min. Länge von 3 Zeichen auch erreicht ist?

Warum wird die TRIM-Anweisung in der Funktion nicht ausgeführt?

Danke schonmal

Thomas
 
array_filter erwartet true oder false. Aber kein neuer wert für den Inhalt.

Du kannst nach dem Array_filter noch ein array_map auf trim durchführen

PHP:
$suchbegriff = explode(",", $_POST["suche"]);
$suchbegriff = array_filter($suchbegriff, "len_suche");
$suchbegriff = array_map('trim', $suchbegriff);

var_dump($suchbegriff);

function len_suche($begriff) {
    return (strlen(trim($begriff)) < 3);
}
 
Danke dir yaslaw,
aber ich habe wohl selber was gefunden: array_walk


PHP:
$suchbegriff = explode(",", $_POST["suche"]);

array_walk($suchbegriff, "len_suche");


function len_suche($arr, $key) {

global $suchbegriff;

$arr = trim($arr);

if (strlen($arr) < 3) {
    unset($suchbegriff[$key]);
} else {
    $suchbegriff[$key] = $arr;
}

}
 
Ich rate dir davon ab, innerhalb der Funktion den Array zu manipulieren , also Einträge zu entfernen.
 
Auch wenn ich mich wiederhole: Ich glaube dir alles.

Aber um nicht dumm zu sterben würde mich interessieren was daran so schlimm ist?
 
Die folgen sind nicht genaus absehbar, wenn man ein array ändert das man gerade durchläuft. Ich kenn die genaue funktiobnalität von array_walk nicht (also ich weiss genau was er normal angewendet alles macht, aber ich weiss nicht wie die Funktion intern funktioniert).

Wenn du array_walk nur brauchst um durch den Array zu gehen, nicht aber wie für array_walk vorgesehen die refernzierte Werte zu verändern, dann kannst du grad so gut mit einem Iterator durchgehen oder mit einer klassischen foreach-Schleife. Damit kannst du dir die Funktion sparen und auch den Globalzugriff auf den Array.
 
Ich kann mich immer wieder nur bedanken und hoffen das ich dir irgendwann vielleicht auch mal helfen kann!
 
Zurück