Blog

Live Suche

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 

Ort (Karte)

0
PHP Array Boost: Lavarel Collections für jedes Pro...
Joomla! 3.6.4 Security Release

Ähnliche Beiträge

Ich stimme zu, dass diese Seite Cookies für Analysen verwendet.