El código siguiente ilustra el extraño comportamiento de las referencias de PHP:¿Alguien puede explicar la diferencia entre estos 2 usos de referencia en PHP?
resultados<?php
function this_works()
{
$root = array('name'=>'root', 'children'=>array());
$level_1 = array('name'=>'level_1', 'children'=>array());
$item1 = array('name'=>'level_2_1', 'children'=>array());
$item2 = array('name'=>'level_2_2', 'children'=>array());
$croot = &$root;
$croot['children'][] = &$level_1;
$croot = &$level_1;
$croot['children'][] = &$item1;
$croot['children'][] = &$item2;
$croot = &$root;
print_r($croot);
}
function this_fails()
{
$root = array('name'=>'root', 'children'=>array());
$level_1 = array('name'=>'level_1', 'children'=>array());
$item1 = array('name'=>'level_2_1', 'children'=>array());
$item2 = array('name'=>'level_2_2', 'children'=>array());
$croot = &$root;
$stack = array();
$croot['children'][] = &$level_1;
$crootref = &$croot;
array_push($stack, $crootref);
$croot = &$level_1;
$croot['children'][] = &$item1;
$croot['children'][] = &$item2;
# this works, assignment below - doesn't... WHY?
#$x = array_pop($stack);
#var_dump($x);
$croot = array_pop($stack);
print_r($croot);
}
this_works();
echo "------------------\n";
this_fails();
?>
Primera función proporciona esperaba, mientras que la segunda falla y afirmaciones acerca de la repetición en bucle:
Array
(
[name] => root
[children] => Array
(
[0] => Array
(
[name] => level_1
[children] => Array
(
[0] => Array
(
[name] => level_2_1
[children] => Array
(
)
)
[1] => Array
(
[name] => level_2_2
[children] => Array
(
)
)
)
)
)
)
------------------
Array
(
[name] => root
[children] => Array
(
[0] => Array
(
[name] => root
[children] => Array
*RECURSION*
)
)
)
Lo que es extraño, es que si en la segunda función, la variable intermedia se usará para obtener el valor de la pila, los resultados vuelven a ser correctos. No entiendo lo que está pasando. ¿Cómo obtengo el elemento raíz como como un hijo de sí mismo muchas veces debido a una asignación?
Originalmente, tenía que construir el árbol de XML (utilizando analizador SAX) y intented tener 'raíz actual' que apunta al nodo de árbol en el nivel y la tendencia actual/pop a/de pila y añadir niño elementos a él, pero, sorprendentemente, no pude implementar este esquema debido a problemas demostrados por dos funciones anteriores.
Entonces, ¿qué hay de malo con ese enfoque?