【问题标题】:Deleting an array element within foreach loop在 foreach 循环中删除数组元素
【发布时间】:2012-02-15 02:32:01
【问题描述】:

我有一个简单的数组,其中包含所有国家/地区的名称和在我的网站上注册的每个国家/地区的用户总数。是这样的:

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

而且,我正在尝试删除具有 0 个用户的数组元素(国家/地区)。

我已尝试使用此代码,但它不起作用:

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

这段代码有什么问题?

【问题讨论】:

标签: php


【解决方案1】:

如果您unset($row),您只是删除了局部变量。

取而代之的是获取密钥并将其删除:

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

【讨论】:

  • 但是如果你在$row 之前添加一个& 符号会怎样(通过引用传递)?
【解决方案2】:

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);

【讨论】:

  • 引用不起作用顺便说一句。它仍然只是一个局部变量。 ;)
  • 此外,最好将 unset($val) 放在 foreach 循环之后以删除引用(这也可以节省答案的最后一段)。
【解决方案3】:

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

尝试: foreach ($country as $key => $value) { if ($row['total'] == 0) { 未设置($国家[$key]); } }

【讨论】:

    猜你喜欢
    • 2010-12-29
    • 2012-01-20
    • 1970-01-01
    • 2014-09-08
    • 2018-08-20
    • 2013-05-04
    • 2012-12-27
    • 1970-01-01
    相关资源
    最近更新 更多