2013-05-15 18 views
5

Sto studiando PHP per un esame avanzato. Il test pratico ha detto che la prima iterazione è migliore della seconda. Non capisco perché. Entrambi eseguono iterazione del contenuto di un array.Qual è la differenza tra queste due iterazioni di array?

// Primo uno:

foreach($array as $key => &$val) { /* ... */ } 

// secondo:

foreach($array as $key => $val) { /* ... */ } 
+0

Sì, tende a confondere meglio le persone: http://stackoverflow.com/questions/6287970/php-foreach-statement-by-reference-unexpected-behaviour-when-reusing-iterator –

+0

Ti suggerisco di leggere [questo ] (http://stackoverflow.com/questions/10057671/how-foreach-actually-works). – BlitZ

+3

Quale esame? Non posso credere che sia stato da ZCE –

risposta

10

La prova pratica detto che la prima iterazione è migliore del secondo.

Questo non è il miglior consiglio. Sono diversi strumenti per diversi lavori.

& significa trattare la variabile per riferimento anziché una copia.

Quando si dispone di un riferimento di variabile, è simile a un puntatore in C. L'accesso alla variabile consente di accedere alla posizione di memoria della variabile originale, consentendo di modificarne il valore tramite un identificatore diverso.

// Some variable. 
$a = 42; 

// A reference to $a. 
// & operator returns a reference. 
$ref = &$a; 

// Assignment of $ref. 
$ref = "fourty-two"; 

// $a itself has changed, through 
// the reference $ref. 
var_dump($a); // "fourty-two" 

esempio di riferimento sul CodePad.

Il comportamento normale di foreach consiste nel rendere disponibile una copia al blocco associato. Ciò significa che sei libero di riassegnarlo e che non influirà sul membro dell'array (questo non sarà il caso per le variabili che sono sempre riferimenti, come le istanze di classe).

Copia esempio su CodePad.

Esempio di istanza di classe su CodePad.

Usare un riferimento in un foreach ha alcuni effetti collaterali, come un penzoloni $val riferimento all'ultimo valore iterata, che può essere modificata successivamente per caso e influenza sull'array.

Esempio di riferimento di dangling su CodePad.

+0

Grazie per l'aiuto! Potresti dire qualcosa in più su "riferimento in contrapposizione a una copia"?La mia unica comprensione di & sarebbe scrivere su una variabile come $ Foo2 = &$Foo1; – Willow

+0

@Willow Sure, vedere la prossima modifica. – alex

+0

Vedo. Quindi se uso e posso modificare l'array al di fuori del ciclo foreach chiamando $ val? Grazie mille! Hai fatto un ottimo lavoro nel chiarirlo. – Willow

1

Il primo esempio comprende la & riferimento operatore per $val -> eventuali modifiche $val verranno salvate $array.

Questo non è affatto "migliore" di esempio # 2, però.

Problemi correlati