有没有办法在纯PHP中检测循环数组?
我正在尝试在PHP中实现我自己的序列化/var_dump样式函数。如果存在循环数组的可能性(确实存在),这似乎是不可能的。
在最近的 PHP 版本中,var_dump似乎可以检测循环数组:
php > $a = array();
php > $a[] = &$a;
php > var_dump($a);
array(1) {
[0]=>
&array(1) {
[0]=>
*RECURSION*
}
}
如何在PHP中实现我自己的序列化类型的方法,可以进行类似的检测?我不能只跟踪我访问过哪些数组,因为对于包含相同元素的不同数组,PHP中数组的严格比较返回true,并且比较循环数组无论如何都会导致致命错误。
php > $b = array(1,2);
php > $c = array(1,2);
php > var_dump($b === $c);
bool(true)
php > $a = array();
php > $a[] = &$a;
php > var_dump($a === $a);
PHP Fatal error: Nesting level too deep - recursive dependency? in php shell code on line 1
我一直在寻找一种方法来查找数组的唯一id(指针),但我找不到一个。spl_object_hash仅适用于对象,不适用于数组。如果我将多个不同的数组投射到对象中,它们都会获得相同的spl_object_hash值(为什么?)。
编辑:
调用print_r,var_dump或在每个数组上序列化,然后使用某种机制来检测这些方法检测到的递归的存在,这是一个算法复杂性的噩梦,基本上会使任何使用都太慢,无法在大型嵌套数组上实现。
接受的答案:
我接受了下面的答案,这是第一个建议暂时改变数组以查看它是否确实与另一个数组相同。这回答了“我如何比较两个数组的标识?”,从中递归检测是微不足道的。