7

I have a simple array which contains name of all the countries and total number of users registered on my website from that each country. It's something like this:

Array (
    [1] => Array ( [name] => Afghanistan [total] => 3 )
    [2] => Array ( [name] => Albania [total] => 0 )
)

And, I'm trying to delete array elements (countries) which have 0 users.

I've tried with this code and it's not working:

foreach($country as $row) {
    if ($row['total'] == 0) {
        unset($row);
    }
}

What is wrong with this code?

1

3 Answers 3

26

If you unset($row) you are only removing the local variable.

Instead fetch the key and remove that:

foreach ($country as $i => $row) {
    if ($row['total'] == 0) {
        unset($country[$i]);
    }
}
Sign up to request clarification or add additional context in comments.

1 Comment

But what if you add an & sign before $row (Pass by reference) ?
3

Foreach creates copies of the keys/values on the array you're looping over, so all you're doing is unsetting the local copy, not the original that's actually in the array. Either access the array directly

foreach($country as $key => $row) {
  if ($row['total'] == 0) {
     unset($country[$key]);
  }
}

or use a reference, unset it and filter NULL elements afterwards:

foreach($country as &$row) {
    if ($row['total'] == 0) {
        $row = (unset) $row;
    }
}
unset($row);
$country = array_filter($country);

2 Comments

Reference won't work btw. It will still only be a local variable. ;)
Additionally it's good practise to put the unset($val) after the foreach loop to remove the reference (this would spare the last paragraph of the answer as well).
0

Because $row is the value, not the entire element.

Try: foreach ($country as $key => $value) { if ($row['total'] == 0) { unset($country[$key]); } }

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.