Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何删除递归?_Php_Recursion_Trace - Fatal编程技术网

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));