2010-06-16 15 views
15

jestem uzyskiwania dostępu do tablicy przez odniesienie wewnątrz pętli foreach, ale wyłączony function() nie wydaje się działać:Wyłączony element tablicy wewnątrz pętli foreach

foreach ($this->result['list'] as &$row) { 
    if ($this_row_is_boring) { 
     unset($row); 
    } 
} 

print_r($this->result['list']); // Includes rows I thought I unset 

Pomysły? Dzięki!

Odpowiedz

30

Usuwasz odniesienie (przerywając odniesienie). trzeba by rozbrojony na podstawie klucza:

foreach ($this->result['list'] as $key => &$row) { 
    if ($this_row_is_boring) { 
     unset($this->result['list'][$key]); 
    } 
} 
+5

Należy zauważyć, że indeksy tablicowe są zachowywane, nawet jeśli nie zostały określone (automatyczne indeksy numeryczne), gdy tablica została zainicjowana. To znaczy, że nie będzie ponownie organizować klawiszy tablic numerycznych, aby były sekwencyjne. – amphetamachine

7
foreach ($this->result['list'] as $key => &$row) { 
    if ($this_row_is_boring) { 
     unset($this->result['list'][$key]); 
    } 
} 
unset($row); 

Pamiętaj: jeśli używasz foreach z odniesieniem, należy użyć rozbrojony do dereference tak że foreach nie kopiuje na następną do góry. More info

+1

Ummm, jeśli używasz foreach z referencją, nie musisz usuwać go w każdej pętli. PHP robi to automatycznie. Powinieneś usunąć dereferencję ** po ** pętli. – ircmaxell

+0

To prawda ... to był literówka. – Cristian

4

Trochę wyjaśnienia powyższych odpowiedzi.

Po unset($row) zmienna $row jest rozbrojona. To nie znaczy, że dane w $row zostały usunięte; na liście znajduje się również element wskazujący na $row.

Pomaga myśleć o zmiennych jako etykietach. Fragment danych może mieć jedną lub więcej etykiet, a unset usuwa tę etykietę, ale nie dotyka rzeczywistych danych. Jeśli wszystkie etykiety zostaną usunięte, dane są automatycznie usuwane.

Powiązane problemy