Pregunta

Quiero poder hacer lo siguiente:

$normal_array       = array();
$array_of_arrayrefs = array( &$normal_array );

// Here I want to access the $normal_array reference **as a reference**,
// but that doesn't work obviously. How to do it?
end( $array_of_arrayrefs )["one"] = 1; // choking on this one

print $normal_array["one"]; // should output 1

Saludos

/ R

¿Fue útil?

Solución

end () no devuelve una referencia del último valor, sino el último valor en sí. Aquí hay una solución alternativa:

$normal_array       = array();
$array_of_arrayrefs = array( &$normal_array );

$refArray = &end_byref( $array_of_arrayrefs );
$refArray["one"] = 1;

print $normal_array["one"]; // should output 1

function &end_byref( &$array ) {
    $lastKey = end(array_keys($array));
    end($array);
    return $array[$lastKey];
}

Otros consejos

Aquí hay un par de enfoques, ninguno de los cuales encuentro particularmente satisfactorio. Estoy seguro de que hay una mejor manera ...

<?php
$normal_array       = array();
$array_of_arrayrefs = array( "blah", &$normal_array );

foreach ($array_of_arrayrefs as &$v);
$v["one"] = 1;

echo $normal_array["one"];  //prints 1
?>


<?php
$normal_array       = array();
$array_of_arrayrefs = array( "blah", &$normal_array );

$lastIndex = @end(array_keys($array_of_arrayrefs)); //raises E_STRICT because end() expects referable.
$array_of_arrayrefs[$lastIndex]["one"] = 1;

echo $normal_array["one"];  //prints 1
?>

Probablemente no deberías pasar por referencia en primer lugar. En general, se considera una mala práctica hacerlo, porque dificulta ver dónde se modifica el estado.

Es un error muy común que las referencias son más rápidas. Este no es el caso: de hecho, son un poco más lentos, pero es una cantidad tan pequeña que realmente no importa. PHP tiene un sistema llamado copy-on-write, lo que significa que las variables no se copian antes de escribirles.

El único lugar donde realmente necesita referencias, fue en PHP4, donde los objetos se clonarían de otra manera. Esto no es necesario en PHP5.

La función end () no solo devuelve un valor. También mueve el puntero interno de la matriz. Luego podemos usar key () para obtener el índice, después de lo cual podemos usar el acceso a la matriz regular para la asignación.

$normal_array       = array();
$array_of_arrayrefs = array( &$normal_array );

end($array_of_arrayrefs);
$array_of_arrayrefs[ key($array_of_arrayrefs) ]["one"] = 1;

print $normal_array["one"];

La línea:

  

fin ($ array_of_arrayrefs) [" one "] = 1; // atragantarse con este

arroja un error de análisis:

  

Error de análisis: error de sintaxis, inesperado '[' en /file.php en la línea 65

Asegúrese de tener error_reporting y display_error activado.

No estoy seguro de lo que quieres hacer, pero esto funciona:

$normal_array       = array();
$array_of_arrayrefs = array( &$normal_array );
// Here I want to access the $normal_array reference **as a reference**,
// but that doesn't work obviously. How to do it?
$array_of_arrayrefs[0]["one"] = 1;
//end($array_of_arrayrefs )["one"] = 1; // choking on this one
print $normal_array["one"]; // should output 1
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top