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;
}