Don't blame me!

Post von realloc | Einsortiert in Code, Meckerecke am 25. Juni 2007 | Keine Kommentare

Was soll man dazu sagen? Wenn eine Seite, die sich mit PHP beschäftigt schon seit Jahren existiert, wächst sicherlich auch der Umfang der “Tipps, Tricks und Code-Schnipsel”. Und manchmal muss man die Sachen auch mal wieder durchsehen, weil das Zeug aus 2001 eben nicht mehr so ganz stimmt, oder? Ich nenne hier ganz bestimmt keine Namen … und Links gibt’s dafür auch nicht ;-) . PHP muss sich ja viel Kritik gefallen lassen. Oft zurecht – aber dann gibt es da Lösungen für Probleme, die garnicht mehr existieren, oder schlimmer noch, nie existiert haben. Nehmen wir uns mal so ein Beispiel vor …

Ewiger Streitpunkt ist ja, wie PHP mit Hashes, Lists, Dictionaries oder eben in PHP-Style Arrays umgeht. Dann gibt’s da zum Beispiel das “Problem”, das man leere Elemente aus einem Array entfernen muss. Dazu wird an anderer Stelle zu folgender Vorgehensweise geraten:

function trim_and_filter_array ($arr) {
    $tmp = array();
    foreach($arr as $value) {
        $value = trim($value);
        if (strlen($value)) $tmp[] = $value;
    }
    return $tmp;
}

$arr = array ("foo", "  ", "bar", "", "baz", "  ");
$arr = trim_and_filter_array ($arr);
foreach ($arr as $value) echo $value . "\n";

Neben der Frage, warum da überhaupt Leerzeichen in den Strings enthalten sind, kann man sich sicher auch Gedanken machen. Wenn der Input nämlich schon vorher durch die eigenen Kontrollemechanismen durchgegangen ist, ist das spätere Herausfiltern auch so ein Kritikpunkt. Aber das ist noch nicht schlimm. Schlimm ist nämlich bei diesem Beispiel, das dies wieder so eine der magischen “Ich mach alles”-Funktionen ist, für die PHP immer kritisiert wird.

Ich versuche es mal mit einer anderen Methode, um mein Problem mit der ersten Lösung zu veranschaulichen:

function trimVal (&$val) {
    $val = trim ($val);
}

$arr = array ("foo", "  ", "bar", "", "baz", "  ");
array_walk ($arr, ‘trimVal’);
foreach (array_filter ($arr) as $val) echo $val . "\n";

Dies macht genau das Gleiche, wie das 1. Beispiel. Leider filtert die Funktion array_filter alle Werte, die auf is_empty () ansprechen, wie z.B. 0, FALSE usw. Wenn das nicht passieren soll, bietet sich noch folgende Möglichkeit an:

function trimVal (&$val) {
    $val = trim ($val);
}

function filterVal ($val) {
    return ($val != "" ? TRUE:FALSE);
}

$arr = array ("foo", "  ", "bar", "", "baz", 0);
array_walk ($arr, ‘trimVal’);
foreach (array_filter ($arr, "filterVal") as $val) echo $val . "\n";

Have fun!

Möglicherweise interessiert Dich auch...

Einen Kommentar schreiben