/** * Invoke callback recursively for all data types * @return mixed * @param $arg mixed * @param $func callback * @param $stack array **/ function recursive($arg, $func, $stack = NULL) { if ($stack) { foreach ($stack as $node) { if ($arg === $node) { return $arg; } } } else { $stack = array(); } switch (gettype($arg)) { case 'object': if (method_exists('ReflectionClass', 'iscloneable')) { $ref = new ReflectionClass($arg); if ($ref->iscloneable()) { $arg = clone $arg; $cast = is_a($arg, 'IteratorAggregate') ? iterator_to_array($arg) : get_object_vars($arg); foreach ($cast as $key => $val) { $arg->{$key} = $this->recursive($val, $func, array_merge($stack, array($arg))); } } } return $arg; case 'array': $copy = array(); foreach ($arg as $key => $val) { $copy[$key] = $this->recursive($val, $func, array_merge($stack, array($arg))); } return $copy; } return $func($arg); }
/** * Invoke callback recursively for all data types * @return mixed * @param $arg mixed * @param $func callback * @param $stack array **/ function recursive($arg, $func, $stack = NULL) { if ($stack) { foreach ($stack as $node) { if ($arg === $node) { return $arg; } } } else { $stack = array(); } switch (gettype($arg)) { case 'object': if (method_exists('ReflectionClass', 'iscloneable')) { $ref = new ReflectionClass($arg); if ($ref->iscloneable()) { $arg = clone $arg; foreach (get_object_vars($arg) as $key => $val) { $arg->{$key} = $this->recursive($val, $func, array_merge($stack, array($arg))); } } } return $arg; case 'array': $tmp = array(); foreach ($arg as $key => $val) { $tmp[$key] = $this->recursive($val, $func, array_merge($stack, array($arg))); } return $tmp; } return $func($arg); }
/** * Attempt to clone object * @return object * @return $arg object **/ function dupe($arg) { if (method_exists('ReflectionClass', 'iscloneable')) { $ref = new ReflectionClass($arg); if ($ref->iscloneable()) { $arg = clone $arg; } } return $arg; }
public function recursive($arg, $func, $stack = null) { if ($stack) { foreach ($stack as $node) { if ($arg === $node) { return $arg; } } } else { $stack = []; } switch (gettype($arg)) { case 'object': if (method_exists('ReflectionClass', 'iscloneable')) { $ref = new \ReflectionClass($arg); if ($ref->iscloneable()) { $arg = clone $arg; $cast = is_a($arg, 'IteratorAggregate') ? iterator_to_array($arg) : get_object_vars($arg); foreach ($cast as $key => $val) { $arg->{$key} = $this->recursive($val, $func, array_merge($stack, [$arg])); } } } return $arg; case 'array': $copy = []; foreach ($arg as $key => $val) { $copy[$key] = $this->recursive($val, $func, array_merge($stack, [$arg])); } return $copy; default: throw new Exception("This method needs first argument to be an array or an object."); } return call_user_func_array($func, $arg); }