我正在尝试在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
我一直在寻找一种找到数组的唯一标识符(指针)的方法,但我找不到。spl_object_hash只适用于对象,而不是数组。如果我将多个不同的数组强制转换为对象,则它们都会获得相同的spl_object_hash值(为什么?)。编辑:
对每个数组调用print_r、var_dump或serialize,然后使用某种机制检测这些方法检测到的递归存在与否,是一个算法复杂度的噩梦,并且基本上会使任何使用过慢以至于在大型嵌套数组上不实用。
已接受答案:
我接受下面的答案,它首先建议暂时更改数组以查看它是否与另一个数组相同。这回答了“如何比较两个数组的身份”的问题,从而递归检测就变得简单了。
json_decode(json_encode())
)将其转换,以摆脱引用,并且仅在之后应用自己的序列化工具。 - mario