PHP: Suchen und Ersetzen von Werten in Arrays(Hashes)

Manches ist einfacher, als manche denken. Hier stand ein Programmierer vor der Aufgabe, in einem Array (Hash) Werte zu finden. Den zweiten Schritt - das Ersetzen - habe ich für weitere Ratsuchende gleich mitgeliefert:

// Testdaten, wirklich wild:
$user = array();
$user[0]['vname']                         = 'Hans';
$user[0]['nname']                         = 'Dampf';
$user[2]['vname']['bar']['solltreffer_1'] = 'SUCHMICH';
$user[2]['vname']['foo']['solltreffer_2'] = 'SUCHMICH';
$user[2]['vname']['long']                 = 'verene';
$user['003']['vname']                     = 'Stein';
$user['003']['nname']                     = 'Hein';
$user['007']                              = 'SUCHMICH';
$user[7]                                  = 'SUCHMICH';

// Aufruf (Test) der Funktionen
print 'Aufruf mit IsInArray($search, $haystack):'."\n";
$ar=IsInArray('SUCHMICH', $user);   // Funktionsaufruf
if ($ar) {
    print "gefunden\n";
} else {
    print "NICHT gefunden\n";
}
print '$ar: ';
print_r($ar);
print "\n----------------------------------------------------------------------\n";

print 'Aufruf mit ReplaceFirstInArray($search, $replace, $haystack):'."\n";
print_r (ReplaceFirstInArray('SUCHMICH', '!!!ERSTER FUND "SUCHMICH" ERSETZT!!!', $user));
print "\n----------------------------------------------------------------------\n";

print 'Aufruf mit ReplaceALLInArray($search, $replace, $haystack):'."\n";
print_r (ReplaceAllInArray('SUCHMICH', '!!!ALLE FUNDE "SUCHMICH" ERSETZT!!!', $user));
print "\n----------------------------------------------------------------------\n";


// Die Funktionen:
function IsInArray( $search, $haystack, $ar=array()) {
     $c=count($ar);
     foreach ( array_keys($haystack) as $k ) {
          $ar[$c] = $k;
          if ($haystack[$k] == $search) {
               return $ar;
          } elseif ( is_array($haystack[$k]) ) {               // wenn array, dann:
               $ret = IsInArray($search, $haystack[$k], $ar);  // rekursiver Funktionsaufruf
               if (false !== $ret) {
                  return $ret;
               }
          }
     }
     return false;
}

function ReplaceFirstInArray($search, $replace, $haystack) {
    $ar=IsInArray($search, $haystack);
    if (false === $ar) {
        print "Kein Fund!\n" ;
        return $haystack;
    } else {
         $var = &$haystack;
         foreach($ar as $k) {
             $var = &$var[$k];  // Hier den "Fundbaum" in $ar "hochklettern" und Referenzen bilden
         }
         $var = $replace;                // Tatsächlich wird an der referenzierten Stelle ersetzt!
    }
    return $haystack;
}

function ReplaceAllInArray($search, $replace, $haystack) {
   $ar = IsInArray($search, $haystack);   
   while ($ar) {                                           // Solange der String gefunden wurde(!)
       $haystack = ReplaceFirstInArray($search, $replace, $haystack); //Ersetzen des ersten Fundes
       $ar = IsInArray($search, $haystack); //Nachschauen, ob es weitere Funde gibt.
   }
   return $haystack;
}

Weitere Informationen in diesem Bereich: