2012-09-06 1 views
5
$arr = array(1); 
$a = & $arr[0]; 

$arr2 = $arr; 
$arr2[0]++; 

echo $arr[0],$arr2[0]; 

// Output 2,2 

¿Puede ayudarme por favor cómo es posible?Confusión de referencia de matrices en PHP

+1

desea que le explicamos cómo funciona? – Wearybands

+1

él solo incrementa en arr2 y quiere saber por qué arr también es el incremento – Dukeatcoding

+1

Quiere decir que este comportamiento es peculiar ya que establece $ a como referencia a $ arr pero nunca usa $ a. Esto de hecho es extraño. – Sherlock

Respuesta

7

Tenga en cuenta, sin embargo, que las referencias dentro de las matrices son potencialmente peligrosas. Hacer una asignación normal (no por referencia) con una referencia en el lado derecho no convierte el lado izquierdo en una referencia , pero las referencias dentro de las matrices se conservan en estas asignaciones normales . Esto también se aplica a llamadas de función donde la matriz es pasada por valor.

/* Assignment of array variables */ 
$arr = array(1); 
$a =& $arr[0]; //$a and $arr[0] are in the same reference set 
$arr2 = $arr; //not an assignment-by-reference! 
$arr2[0]++; 
/* $a == 2, $arr == array(2) */ 
/* The contents of $arr are changed even though it's not a reference! */ 
+0

Nunca lo sabía. +1 – Sherlock

+1

RTFM FTW! :-D +1 – DaveRandom

+1

@DaveRandom Por favor, abreviar RTFM FTW. Me temo que lo estoy tomando de la manera incorrecta;) –

-1

Parece $ arr [0] y $ arr2 [0] apuntan a la misma memoria asignada, por lo que si incrementas en uno de los punteros, el int se incrementan en la memoria

Enlace Are there pointers in php?

+2

La pregunta es ¿por qué? Apunta a la misma memoria asignada. – Sherlock

+0

no lo he leído pero, $ arr2 = $ arr; parece no copiar $ arr pero solo para crear un nuevo puntero como en C – Dukeatcoding

0
$arr = array(1);//creates an Array ([0] => 1) and assigns it to $arr 
$a = & $arr[0];//assigns by reference $arr[0] to $a and thus $a is a reference of $arr[0]. 
//Here $arr[0] is also replaced with the reference to the actual value i.e. 1 

$arr2 = $arr;//assigns $arr to $arr2 

$arr2[0]++;//increments the referenced value by one 

echo $arr[0],$arr2[0];//As both $aar[0] and $arr2[0] are referencing the same block of memory so both echo 2 

// Output 22 
Cuestiones relacionadas