I had the same solution as KingCrunch, but as he already answered, I was interested in the str_replace with a callback for replacements and came up with this ( Demo ):
$subject = array('OldOldOld', 'Old string Old more string Old some more string'); $search = array('Old', 'string'); $replace = array( function($found, $count) {return 'New'.$count;}, function($found, $count) {static $c=0; return 'String'.(++$c);} ); $replace = array(); print_r(str_ureplace($search, $replace, $subject)); /** * str_ureplace * * str_replace like function with callback * * @param string|array search * @param callback|array $replace * @param string|array $subject * @param int $replace_count * @return string|array subject with replaces, FALSE on error. */ function str_ureplace($search, $replace, $subject, &$replace_count = null) { $replace_count = 0; // validate input $search = array_values((array) $search); $searchCount = count($search); if (!$searchCount) { return $subject; } foreach($search as &$v) { $v = (string) $v; } unset($v); $replaceSingle = is_callable($replace); $replace = $replaceSingle ? array($replace) : array_values((array) $replace); foreach($replace as $index=>$callback) { if (!is_callable($callback)) { throw new Exception(sprintf('Unable to use %s (#%d) as a callback', gettype($callback), $index)); } } // search and replace $subjectIsString = is_string($subject); $subject = (array) $subject; foreach($subject as &$haystack) { if (!is_string($haystack)) continue; foreach($search as $key => $needle) { if (!$len = strlen($needle)) continue; $replaceSingle && $key = 0; $pos = 0; while(false !== $pos = strpos($haystack, $needle, $pos)) { $replaceWith = isset($replace[$key]) ? call_user_func($replace[$key], $needle, ++$replace_count) : ''; $haystack = substr_replace($haystack, $replaceWith, $pos, $len); } } } unset($haystack); return $subjectIsString ? reset($subject) : $subject; }
source share