/** * @param array|object $collection * @param callable $callable * @param bool $recursionFirst * @return array|object * @throws Exception */ function collection_map_val_recursive($collection, $callable, $recursionFirst = true) { if (is_array($collection)) { $ret = array_map_val_recursive($collection, function () use($callable, $recursionFirst) { $args = func_get_args(); if (!$recursionFirst) { $args[0] = call_user_func_array($callable, $args); } if (is_object($args[0]) || is_array($args[0])) { $args[0] = collection_map_val_recursive($args[0], $callable, $recursionFirst); } if ($recursionFirst) { $args[0] = call_user_func_array($callable, $args); } return $args[0]; }, $recursionFirst); } elseif (is_object($collection)) { $ret = object_map_val_recursive($collection, function () use($callable, $recursionFirst) { $args = func_get_args(); if (!$recursionFirst) { $args[0] = call_user_func_array($callable, $args); } if (is_array($args[0]) || is_object($args[0])) { $args[0] = collection_map_val_recursive($args[0], $callable, $recursionFirst); } if ($recursionFirst) { $args[0] = call_user_func_array($callable, $args); } return $args[0]; }, $recursionFirst); } else { debug_enforce(false, "Cannot handle collection: " . var_dump_human_compact($collection)); $ret = []; } return $ret; }
/** * @param object $config * @param callable $callable * @param bool $recursionFirst * @return object */ function object_map_val_recursive($config, $callable, $recursionFirst = true) { $ret = clone $config; foreach ($config as $key => $val) { if (!$recursionFirst) { $ret->{$key} = call_user_func($callable, $val, $key); } if (is_object($val)) { $val = object_map_val_recursive($val, $callable); } if ($recursionFirst) { $ret->{$key} = call_user_func($callable, $val, $key); } } return $ret; }