function stringify($arg, array $stack = NULL)
{
if ($stack) {
foreach ($stack as $node) {
if ($arg === $node) {
return '*RECURSION*';
}
}
} else {
$stack = [];
}
switch (gettype($arg)) {
case 'object':
$str = '';
foreach (get_object_vars($arg) as $key => $val) {
$str .= ($str ? ',' : '') . var_export($key, TRUE) . '=>' . $this->stringify($val, array_merge($stack, [$arg]));
}
return get_class($arg) . '::__set_state([' . $str . '])';
case 'array':
$str = '';
$num = isset($arg[0]) && ctype_digit(implode('', array_keys($arg)));
foreach ($arg as $key => $val) {
$str .= ($str ? ',' : '') . ($num ? '' : var_export($key, TRUE) . '=>') . $this->stringify($val, array_merge($stack, [$arg]));
}
return '[' . $str . ']';
default:
return var_export($arg, TRUE);
}
}