Unset an array element inside a foreach loop

13,167

Solution 1

You're unsetting the reference (breaking the reference). You'd need to unset based on a key:

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

Solution 2

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

Remember: if you are using a foreach with a reference, you should use unset to dereference so that foreach doesn't copy the next one on top of it. More info

Solution 3

A bit of an explanation to the answers above.

After unset($row) the variable $row is unset. That does not mean the data in $row is removed; the list also has an element pointing to $row.

It helps to think of variables as labels. A piece of data can have one or more labels, and unset removes that label but does not touch the actual data. If all labels are removed the data is automatically deleted.

Share:
13,167

Related videos on Youtube

Summer
Author by

Summer

I'm the founder and developer of VoterNotes. Type in your zip code to find out who represents you, and who is running for office where you live.

Updated on April 25, 2022

Comments

  • Summer
    Summer about 2 years

    I'm accessing an array by reference inside a foreach loop, but the unset() function doesn't seem to be working:

    foreach ( $this->result['list'] as &$row ) {
        if ($this_row_is_boring) {
            unset($row);
        }
    }
    
    print_r($this->result['list']); // Includes rows I thought I unset
    

    Ideas? Thanks!

  • amphetamachine
    amphetamachine almost 14 years
    Of note is that array indexes are preserved, even if you did not specify them (automatic numeric indexes) when the array was initialized. That is to say, it will not re-organize numeric array keys to be sequential.
  • ircmaxell
    ircmaxell almost 14 years
    Ummm, if you're using a foreach with a reference, you don't need to unset it on each loop. PHP does that for you automatically. You should dereference it after the loop.
  • Cristian
    Cristian almost 14 years
    That's true... it was a typo.