This is what I've written:
class TEST {
function awalk($func,$arr) {
$args = func_get_args(); array_shift($args); array_shift($args);
foreach ($arr as &$val) {
if (!is_array($val)) {
$val = call_user_func_array($func,array_merge((array)$val,$args));
}
else {
$val = call_user_func_array(__METHOD__,array_merge((array)$func,array($val),$args));
}
}
return($arr);
}
}
$test = new TEST();
function reverse_upper_add($input,$addtext,$prependtext) {
return $prependtext.strtoupper(strrev($input)).$addtext;
}
$testarr = array('london',array('ny',array('la',array('tokyo',array('paris'),'rome'),'moscow'),'dublin',array('berlin',array('warsaw'))),'madrid','lapaz');
print_r($test->awalk('reverse_upper_add',$testarr,'-yepp','wow-'));
Array
(
[0] => wow-NODNOL-yepp
[1] => Array
(
[0] => wow-YN-yepp
[1] => Array
(
[0] => wow-AL-yepp
[1] => Array
(
[0] => wow-OYKOT-yepp
[1] => Array
(
[0] => wow-SIRAP-yepp
)
[2] => wow-EMOR-yepp
)
[2] => wow-WOCSOM-yepp
)
[2] => wow-NILBUD-yepp
[3] => Array
(
[0] => wow-NILREB-yepp
[1] => Array
(
[0] => wow-WASRAW-yepp
)
)
)
[2] => wow-DIRDAM-yepp
[3] => wow-ZAPAL-yepp
And I ask you to tell me is this all ok, maybe I forgot about some tricks to make it faster or simpler.