SPL: Arrays rekursiv durchlaufen

Schon lange keinen Eintrag mehr hier vorgenommen. Aus diesem Grund heute mal ein ultrawichtiger, überaus brauchbarer Tipp aus meinem PHP Alltag. Zumindest hat mir die SPL mal wieder den Arsch gerettet. Unfassbar, welch mächtiges Werkzeug die SPL ist.

Zum einen habe ich ein großes, mehrdimensionales Array, in welchem ich nach einem bestimmten Key suchen muss. Natürlich bietet PHP von Hause aus einige nützliche Array Funktionen an, mit denen man dieses Problem relativ einfach lösen könnte. Wenn man aber in einem Projekt arbeitet, welches strikt objektorientiert aufgezogen ist, möchte man auch weiterhin in diesem Stil weiterarbeiten und die Aufgabe in so wenig Codezeilen wie möglich lösen. Einfach gesagt: wir machen es uns einfach und wollen uns nicht großartig anstrengen. Was liegt da näher, als die SPL anzustrengen. Die Standard PHP Library bietet für das rekursive Durchlaufen von Arrays das RekursiveArrayIterator Objekt an.

Als Beispiel hier mal ein Array, in dem wir den Schlüssel „foo“ suchen und das zum Schlüssel dazugehörige Array ausgeben möchten. Also eigentlich ein Array, wie wir es tagtäglich in jedem PHP Script finden könnten.

1
2
3
4
$meinArray = array(
    'test1' => array('bla' => 'blubb'),
    'test2' => array('foo' => array('bar1', 'bar2'))
);

Jetzt kommt das RecursiveArrayIterator Objekt zum Einsatz. In Zusammenarbeit mit der iterator_apply() Funktion kann man hiermit richtig schöne Sachen machen. Also suchen wir einfach mal unser foo-Array.

1
2
3
4
5
6
7
8
9
10
11
12
13
$iterator = new RecursiveArrayIterator($testArray);
$count = iterator_apply($iterator, 'recursiveKeySearch', array($iterator, 'foo'));
 
function recursiveKeySearch($iterator, $needle) {
    while ($iterator->valid()) {
	if ($iterator->hasChildren() && $iterator->key() != $needle) {
            recursiveKeySearch($iterator->getChildren(), $needle);
	} else if ($iterator->key() == $needle) {
	    echo var_dump($iterator->current());
	}
	$iterator->next();
    }
}

Was habe ich jetzt gemacht? Zunächst habe ich mein Array an das RecursiveArrayIterator Objekt übergeben. So habe ich all die schönen Methoden des ArrayIterator Objektes der SPL für mein Array parat. Zusätzlich rufe ich mit der Methode iterator_apply() eine Funktion recursiveKeySearch() auf, die auf jedes Element im Iterator angewendet wird. Diese Funktion macht eigentlich nichts anderes, als das Array zu durchlaufen und dabei nach meinem Schlüssel ausschau zu halten. Dabei wird jedes Element des Arrays auf den zu suchenden Schlüssel überprüft. Wenn mein Schlüssel endlich gefunden wurde, wird das Ergebnis ausgegeben.

Sehr schön ist dabei nicht nur die OOP Notation, sondern auch die Geschwindigkeit. Ebenfalls kann ich mit dem RecursiveArrayIterator komplette Objekte durchlaufen, was mir beim Durchsuchen von Datenobjekten schon sehr weitergeholfen hat. Danke SPL!

About Author: Marcel
Ich bin Senior PHP Developer bei MM Newmedia. Seit 2005 bin ich begeisterter Webentwickler und arbeite als Freelancer für namenhafte Firmen und entwickle jede Menge abgefahrenes Zeug und berichte darüber in meinem Blog.

Kommentar verfassen