2013-08-10 18 views
5

Nikić affermato nel another thread:Perché foreach aumenta il conteggio di 2 invece di 1?

Poco prima [a foreach] iterazione $array è "soft copiato" per l'uso in foreach. Ciò significa che nessuna copia attuale è fatto, ma solo la refcount del zval di $array è aumentato a 2.

Tuttavia, il mio codice di prova sta mostrando un risultato diverso:

$array = array(0, 1, 2); 
xdebug_debug_zval('array'); // refcount=1, is_ref=0 
          // so far so good 
foreach ($array as $key => $value) { 
    xdebug_debug_zval('array'); // refcount=3, is_ref=0 
}        // why is refcount 3 instead of 2? 

Semplicemente guardando il codice, possiamo vedere al massimo due variabili di array.

Perché il conto 3?

Perché non viene effettuato il conto 2 dopo l'esecuzione di foreach?

+0

Nel ciclo foreach non dovresti fare riferimento all'elemento dell'array usando la variabile $ value? – Crackertastic

+0

@Crackertastic, non sto usando nessuna variabile all'interno del ciclo. – Pacerier

+1

Ricevo 'refcount' 2, mi manca qualcosa? 'array: (refcount = 2, is_ref = 0) = array (0 => (refcount = 1, is_ref = 0) = 0, 1 => (refcount = 1, is_ref = 0) = 1, 2 => (conteggio = 2, is_ref = 0) = 2) ' – vee

risposta

1

xdebug_debug_zval() sta guardando la variabile $ array e non la variabile $ key. se si modifica il codice per:

foreach ($array as $key => $value) { 
    echo $key . " : " . $values . "<br>"; 
    //xdebug_debug_zval('array'); 

} 

saranno restituiti i valori corretti della matrice. Non ho la funzione xdebug quindi non posso testare il valore che hai messo lì.

+0

Ho testato il tuo codice e 'xdebug_debug_zval ('array');' mostra ancora '3' invece di' 2'. Non sto testando i valori dell'array, ma il refcount dell'array. – Pacerier

+0

OK. Mentre ti trovi nel ciclo foreach dovrai cambiare il valore di xdebug ... Al momento stai sempre guardando l'intero array, non l'elemento nell'array. – jeff

+0

Non voglio guardare l'elemento nell'array .... Sto osservando l'array perché * che * è ciò di cui tratta questa domanda. Perché la matrice fornisce il conto 3 invece di 2? – Pacerier