альтернатива array_walk

diamond_krnl

pure-php
альтернатива array_walk

тут написал альтернативу array_walk():

PHP:
function array_callback(&$in, $fn)
{
  if(is_array($in)) 
  {
    foreach($in as $k=>$v)
    {
      array_callback($in[$k], $fn); 
    }
  }
  else { $in = call_user_func($fn, $in); }
}
в чём же разница?
параметр передаётся через ссылку, то есть можно применять array_callback($_POST['c'], 'intval') (как пример против инекций можно применять addslashes для не любителей magic_qoutes), с array_walk такое не прошло бы, потому как в intval по значению передаются параметры.

еще пример примения был на особо тупом хостинге, эмуляция magic_quotes_gpc=off:
PHP:
if(get_magic_quotes_gpc())
{
  array_callback($_GET, 'stripslashes');
  array_callback($_POST, 'stripslashes');
  array_callback($_COOKIE, 'stripslashes');
  array_callback($_REQUEST, 'stripslashes');
  $HTTP_GET_VARS = &$_GET;
  $HTTP_POST_VARS = &$_POST;
  $HTTP_COOKIE_VARS = &$_COOKIE;
}
ini_set('magic_quotes_gpc', 0);

открытия конечно не сделал но не понятно почему array_walk работает имено так, либо похожей функции нет в пхп?
 

Profic

just Profic (PHP5 BetaTeam)
Для начала функция, которая вызывается [m]array_walk[/m]()-ом вполне себе может менять значения элементов массива. Для этого всего-то нужно, чтобы эта функция принимала свой первый аргумент по ссылке. Другое дело, что почти все функции, которые хотелось бы применить, принимают аргумент по значению и возвращают измененное значение.
Способов два:
1) [m]array_map[/m](), но она не реализует рекурсии.
2) функция, которая принимает аргумент по ссылке и внутри себя вызывает callback передаваемый в качестве 3 параметра [m]array_walk[/m]()/[m]array_walk_recursive[/m]().
 
Сверху