Foreach-Schleife ersetzen durch array_*

Parantatatam

mag Cookies & Kekse
Hallo,

ich habe seit einiger Zeit mal wieder eine Frage an euch. Diesmal geht es mir darum, dass ich eine rekursive Funktion habe. Leider muss die Funktion sich über eine Foreach-Schleife immer wieder selber aufrufen, was doch sehr belasten wird, wenn die Größe meiner Arrays steigt. Vielleicht gibt es da so etwas wie array_map oder array_walk (was nicht funktioniert!).

Das ist mein Skript (wichtiger Teil ist mit entsprechenden Kommentaren gekennzeichnet (22. - 24.)):
PHP:
<?php
	function trimmer($value) {
		
		// Wenn der uebergebene Wert eine Zeichenkette ist
		if(is_string($value)) {
			// Zeichenkette anhand der Leerzeichen auftrennen => Array
			$value = explode(' ', $value);
			
			// Leere Arraywerte loeschen
			$value = array_filter($value, 'space');
			
			// Array anhand der Leerzeichen zu einer Zeichenkette zusammenfuegen
			$value = implode(' ', $value);
			
			// Ausgabe der Zeichenkette
			return $value;
		}
		// Wenn der uebergebene Wert ein Array ist
		elseif(is_array($value)) {
			
			// ======= SOLL veraendert werden
			foreach($value as $var) {
				$new[] = trimmer($var);
			}
			// ================================
			
			// Ausgabe des Arrays
			return $new;
		}
		
		// Wenn der uebergebene Wert weder eine Zeichenkette noch ein Array ist
		return $value;
	}
	
	// Anwendung
	var_dump(trimmer(array('  24  23  ', array('  88   2323  23  ', array(' asd 23  2323   2323  ', 'asdasd  23  23 #  ', 2323, TRUE)))));
?>

Was will ich mit dieser Funktion erreichen? Nun, da trim nicht wirklich funktioniert und nur auf Zeichenketten angewandt werden kann, habe ich mir eine Funktion geschrieben, welche sowohl aus Zeichenkette als auch Werten in einem Array (welche Zeichenketten sind) die Leerzeichen entfernen kann (Anfang, Ende und zwischendurch immer nur eins).

PS: Ich rufe in der Funktion eine Funktion namens space auf. Diese kann ignoriert werden, da sie nur dafür da ist die leeren Arraywerte zu löschen.
 
Hallo,

statt explode, array_filter & implode kannst du auch mit trim und regulären Ausdrücken arbeiten:
PHP:
$value = preg_replace('\s{2,}/', ' ', trim($value));

Grüße,
Matthias
 
An saftmeister: Das ist ganz einfach: weil es nicht funktioniert.

PHP Manual hat gesagt.:
Sie werden bemerken, dass der Schlüssel 'süß' nicht angezeigt wird. Jeder Schlüssel, der ein Array beinhaltet, wird nicht an die Funktion übergeben.

An Matthias Reitinger: Danke, an so etwas hatte ich auch schon gedacht, wollte aber erstmal dieses Problem lösen.
PHP:
$value = preg_replace('#\s{2,}#', ' ', trim($value));
 
Zuletzt bearbeitet:
an saftmeister: In dieser Klasse habe ich aber wiederum eine Foreach-Schleife, was ich, wie gesagt, beseitigen wollte.
Wieso willst du denn diese Schleife unbedingt beseitigen? [phpf]array_walk_recursive[/phpf] kann man hier übrigens sehr wohl einsetzen:
PHP:
<?php
function trimmer(&$value) {
        if (is_string($value)) {
                $value = preg_replace('#\s{2,}#', ' ', trim($value));
        }
}

$array = array('  24  23  ', array('  88   2323  23  ', array(' asd 23  2323   2323  ', 'asdasd  23  23 #  ', 2323, TRUE)));
array_walk_recursive($array, 'trimmer');
var_dump($array);
?>
Ausgabe:
Code:
array(2) {
  [0]=>
  string(5) "24 23"
  [1]=>
  array(2) {
    [0]=>
    string(10) "88 2323 23"
    [1]=>
    array(4) {
      [0]=>
      string(16) "asd 23 2323 2323"
      [1]=>
      string(14) "asdasd 23 23 #"
      [2]=>
      int(2323)
      [3]=>
      bool(true)
    }
  }
}

Grüße,
Matthias
 
Der für mich sinnvollste Weg wäre ohnehin, das Array gleich nur in Großbuchstaben zu befüllen. Kommt zwar auf die Quelle an, aber sollte es aus einer Datenbank kommen, kann man da sicherlich was machen.

Edit:

Upps, hier gings ja ums trimmen.
 
Zuletzt bearbeitet:
Zurück