2013-05-15 12 views
5

Studiuję PHP dla zaawansowanego egzaminu. Test praktyczny powiedział, że pierwsza iteracja jest lepsza niż druga. Nie rozumiem dlaczego. Obie iterują zawartość tablicy po prostu dobrze.Jaka jest różnica między tymi dwiema iteracjami tablicowymi?

// Pierwszy:

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

// Druga jeden:

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

Tak, to ma tendencję do dezorientowania ludzi: http://stackoverflow.com/questions/6287970/php-foreach-statement-by-reference-unexpected-behaviour-when-reusing-iterator –

+0

Proponuję ci przeczytać [to ] (http://stackoverflow.com/questions/10057671/how-foreach-actually-works). – BlitZ

+3

Jaki egzamin? Nie mogę uwierzyć, że to było z ZCE –

Odpowiedz

10

Test praktyka mówi, że pierwsza iteracja jest lepsza niż sekundę.

To nie jest najlepsza rada. Są to różne narzędzia do różnych zadań.

The & oznacza traktować zmienną przez odniesienie w przeciwieństwie do kopii.

Kiedy masz referencję do zmiennej, jest ona podobna do wskaźnika w C. Uzyskiwanie dostępu do zmiennej umożliwia dostęp do lokalizacji w pamięci oryginalnej zmiennej, co pozwala modyfikować jej wartość za pomocą innego identyfikatora.

// 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" 

przykład odniesienia na CodePad.

Normalne zachowanie foreach polega na udostępnieniu kopii powiązanemu blokowi. Oznacza to, że możesz go ponownie przypisać i nie wpłynie to na element tablicy (nie będzie tak w przypadku zmiennych, które zawsze są referencjami, na przykład instancji klasy).

Przykład kopiowania na CodePad. []

używając informacji w foreach ma pewne skutki uboczne, takie jak wiszącym $val odniesieniu do ostatniej wartości powtarzanych w ciągu, który może być modyfikowany później przypadkowo i mają wpływ na układ.

Przykład referencji zwisających na CodePad.

+0

Dzięki za pomoc! Czy możesz powiedzieć coś więcej o "referencji w przeciwieństwie do kopii"?Moje jedyne zrozumienie & bym pisał nad zmienną taką jak $ Foo2 = &$Foo1; – Willow

+0

@Willow Jasne, zobacz nadchodzącą edycję. – alex

+0

Rozumiem. Więc jeśli użyję & mogę edytować tablicę poza pętlą foreach, wywołując $ val? Dziękuję bardzo! Wykonałeś niesamowitą robotę, aby to wyjaśnić. – Willow

1

Pierwszy przykład zawiera & referencyjnych operatora sieci $val -> wszelkie zmiany $val zostanie zapisany $array.

Nie jest to jednak wcale "lepszy" niż przykład # 2.

Powiązane problemy