
Rekursive Suche: Multidimensionale Arrays & Objects
Es kommt eigentlich in jedem Projekt vor, dass ich ein Array oder Object durchsuchen muss. Je nach Framework oder CMS gibt es bereits Lösungen für spezifische Suchen. Nicht immer setze ich auf ein Framework oder erreiche mit den implementierten Funktionen von Content-Management-Systemen was ich brauche. Deswegen habe ich eine für die meisten Fälle brauchbare Funktion geschrieben, welche stets in meinen Programmen in einem Trait oder sonst wo implementiert wird:
/**
* Search for a value in a multidimensional array or object
*
* @param $needle What to search for
* @param $haystack The array to search in
* @param bool $strict Strict mode
* @param $needle_field The field name to search in
* @return bool
*
* @author Pascal Jordin
*/
function search_recursive($needle, $haystack, $strict = false, $needle_field = false){
if ($needle_field) {
if (is_array($haystack)){
foreach ($haystack as $item) {
if (isset($item[$needle_field]) && ($strict ? $item[$needle_field] === $needle : $item[$needle_field] == $needle) || ((is_object($item) || is_array($item)) && search_recursive($needle, $item, $strict, $needle_field))) {
return true;
}
}
} elseif (is_object($haystack)){
foreach ($haystack as $item) {
if (isset($item->$needle_field) && ($strict ? $item->$needle_field === $needle : $item->$needle_field == $needle) || ((is_object($item) || is_array($item)) && search_recursive($needle, $item, $strict, $needle_field))) {
return true;
}
}
}
} else {
if (is_array($haystack) || is_object($haystack) || $haystack instanceof Traversable) {
foreach ($haystack as $item) {
if (($strict ? $item === $needle : $item == $needle) || ((is_object($item) || is_array($item)) && search_recursive($needle, $item, $strict, $needle_field))) {
return true;
}
}
}
}
return false;
}
Ich denke die Funktion ist selbsterklärend. Andernfalls hier ein paar Beispiele:
$garage = array
(
array( "car" => "Audi" ),
array( "car" => "BMW" ),
array( "car" => "Mercedes Benz" ),
array( "car" => "Volkswagen" ),
array( "bike" => "BMW" ),
array( "bike" => "Suzuki" ),
array( "bike" => "Kawasaki" ),
array( "bike" => "Honda" ),
);
//Search for any BMW
search_recursive('BMW', $garage); //true
//Search only for a BMW bike
search_recursive('BMW', $garage, false, 'bike'); //true
//Search for a Honda car
search_recursive('Honda', $garage, false, 'car'); //false