在foreach循环中删除数组元素

7

我有一个简单的数组,包含所有国家的名称以及在我的网站上注册的用户总数。它看起来像这样:

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

我正在尝试删除用户数为0的数组元素(国家)。

我已经尝试了以下代码,但它没有起作用:

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

这段代码有什么问题?

2
可能是 如何在 foreach 循环中删除数组元素? 的重复问题。 - 7hi4g0
3个回答

26
如果你执行 unset($row),那么只会移除局部变量。相反,应该获取键并将其移除:
foreach ($country as $i => $row) {
    if ($row['total'] == 0) {
        unset($country[$i]);
    }
}

但是如果在 $row 前面添加一个 & 符号(通过引用传递),会发生什么? - user2742371

3

Foreach会在循环过程中创建键/值的副本,所以你只是在取消本地副本,而不是实际在数组中的原始副本。要么直接访问该数组。

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

或者使用引用,取消它并过滤掉NULL元素。
foreach($country as &$row) {
    if ($row['total'] == 0) {
        $row = (unset) $row;
    }
}
unset($row);
$country = array_filter($country);

2
参考不会起作用,它仍然只是一个局部变量。 ;) - NikiC
此外,将 unset($val) 放在 foreach 循环之后以删除引用是一个好的实践(这也可以省去答案的最后一段)。 - hakre

0

因为 $row 是值,而不是整个元素。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接