Estoy tratando de implementar mi propia función de serialización/var_dump style en PHP. Parece imposible si existe la posibilidad de matrices circulares (que hay).¿Hay alguna forma de detectar matrices circulares en PHP puro?
En las últimas versiones de PHP, var_dump parece detectar matrices circulares:
php > $a = array();
php > $a[] = &$a;
php > var_dump($a);
array(1) {
[0]=>
&array(1) {
[0]=>
*RECURSION*
}
}
¿Cómo iba a aplicar mi propio tipo de serialización del método en PHP que puede detectar de manera similar? No puedo simplemente hacer un seguimiento de las matrices que he visitado, porque la comparación estricta de matrices en PHP devuelve verdadero para diferentes matrices que contienen los mismos elementos y la comparación de matrices circulares causa un error fatal, de todos modos.
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
He buscado una forma de encontrar una identificación única (puntero) para una matriz, pero no puedo encontrar una. spl_object_hash solo funciona en objetos, no en matrices. Si lanzo múltiples diferentes matrices a objetos, todas obtienen el mismo valor spl_object_hash (¿por qué?).
EDIT:
Calling print_r, var_dump, o serializar en cada matriz y a continuación, utilizando algún mecanismo para detectar la presencia de la recursión como se detecta por estos métodos es una pesadilla complejidad algorítmica y, básicamente, hacer cualquier uso demasiado lento para ser práctico en grandes matrices anidadas.
respuesta aceptada:
que aceptó la respuesta a continuación que fue el primero en sugerir temporalmente alterar la una matriz para ver si es de hecho la misma que otra matriz. Eso responde al "¿cómo puedo comparar dos matrices para la identidad?" de la cual la detección de recursión es trivial.
La respuesta va a ser: no puedes. Ver [verificar si object/array es una referencia] (http://stackoverflow.com/questions/3148125/php-check-if-object-array-is-a-reference). No es posible realizar comparaciones de referencia tipo puntero, por lo que tampoco es posible detectar un ciclo. Una mejor solución en su caso podría ser lanzarla a través de una de las funciones nativas ('json_decode (json_encode())') para deshacerse de las referencias, y solo después aplicar su propia serialización. – mario
Ahora, incluso PHPUnit está utilizando el método de "marcado" temporal para detectar la recursión de matrices. – postfuturist