<?php
function remove_recursion($o){
static $replace;
if(!isset($replace))
$replace = create_function('$m','$r="\x00{$m[1]}ecursion_";return \'s:\'.strlen($r.$m[2]).\':"\'.$r.$m[2].\'";\';')
;
if(is_array($o) || is_object($o)){
$re = '#(r|R):([0-9]+);#';
$serialize = serialize($o);
if(preg_match($re, $serialize)){
$last = $pos = 0;
while(false !== ($pos = strpos($serialize, 's:', $pos))){
$chunk = substr($serialize, $last, $pos - $last);
if(preg_match($re, $chunk)){
$length = strlen($chunk);
$chunk = preg_replace_callback($re, $replace, $chunk);
$serialize = substr($serialize, 0, $last).$chunk.substr($serialize, $last + ($pos - $last));
$pos += strlen($chunk) - $length;
}
$pos += 2;
$last = strpos($serialize, ':', $pos);
$length = substr($serialize, $pos, $last- $pos);
$last += 4 + $length;
$pos = $last;
}
$serialize = substr($serialize, 0, $last).preg_replace_callback($re, $replace, substr($serialize, $last));
$o = unserialize($serialize);
}
}
return $o;
}
$o = new stdClass;
$o->n = $o;
$o->r = &$o;
echo serialize($o), '
',
serialize(
remove_recursion($o)
)
;
preferences:
31.65 ms | 402 KiB | 5 Q