Php 如何删除递归?
我正在尝试Php 如何删除递归?,php,recursion,trace,Php,Recursion,Trace,我正在尝试json\u encodedebug\u backtrace输出,以便将此信息存储在数据库中 问题是有时它包含递归。我不在乎的事。只要在检测到递归的点上进行*递归*,就足够了 如何做到这一点?序列化确实是一个不错的选择 如果没有这些,那么就没有其他方法来遍历树,保留所有数组和对象,并查看它们是否引用相同的值 对于对象,这会更容易一些,因为可以使用spl\u object\u散列 对于数组,我现在能想到的唯一方法是 function referToTheSame(&$arr1,
json\u encode
debug\u backtrace
输出,以便将此信息存储在数据库中
问题是有时它包含递归。我不在乎的事。只要在检测到递归的点上进行*递归*
,就足够了
如何做到这一点?序列化确实是一个不错的选择 如果没有这些,那么就没有其他方法来遍历树,保留所有数组和对象,并查看它们是否引用相同的值 对于对象,这会更容易一些,因为可以使用spl\u object\u散列 对于数组,我现在能想到的唯一方法是
function referToTheSame(&$arr1, &$arr2) {
// copy
$tmp = $arr1;
$arr1 = 'foo';
$result = ($arr2==='foo');
$arr1 = $tmp;
return $result;
}
我很想知道有没有更聪明的方法
哦,既然你只对破坏递归感兴趣,而且没有太多的引用,这就不必那么昂贵了。只需在遍历时保留一个堆栈,这样您只需与父对象进行比较
编辑
我情不自禁。这会打断数组引用,但不会打断对象引用。当然你能想出一个办法:
(警告:丑陋代码)
我自己也有类似的问题。我也用一个函数解决了这个问题,该函数遍历并删除了所有递归引用。讽刺的是,这样做的函数本身就是递归的!这就是我想到的:
public static function remove_recursion(&$object, &$stack = array()) {
if ((is_object($object) || is_array($object)) && $object) {
if (!in_array($object, $stack, true)) {
$stack[] = $object;
foreach ($object as &$subobject) {
self::remove_recursion($subobject, $stack);
}
} else {
$object = "***RECURSION***";
}
}
return $object;
}
对于第一个调用,您不需要传入第二个参数,当它递归时,它就在那里。只需将
序列化
,然后将取消序列化
。这对我很有用:
$backtrace = debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT);
$backtrace = unserialize(serialize($backtrace));
die(json_encode(backtrace));
数据库值不需要编码为JSON。我需要将这些数据存储为错误报告的一部分。我不关心关系,或者应该说,我不想仅仅为回溯信息创建另外两个表。现在会发生什么?举个例子会很有帮助。尽量简短。@alex-你怎么能给出这样的经验法则?!OP有一个简单的问题;如何使用递归引用对PHP值进行json_编码。不要关闭这个。我认为这与循环函数无关。debug_backtrace的输出仍然可以包含通过“object”和“args”键的循环引用。如果我错了,请纠正我,但这里似乎不应通过引用传递堆栈参数,因为它修改了所有递归层的堆栈,而不仅仅是下层的堆栈。这是不正确的。您正在进行深度优先搜索,这会产生错误的输出,但对我不起作用。我刚刚收到
HTTP/2500内部服务器错误
。
$backtrace = debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT);
$backtrace = unserialize(serialize($backtrace));
die(json_encode(backtrace));