【问题标题】:Unset an array element inside a foreach loop [duplicate]在foreach循环中取消设置数组元素[重复]
【发布时间】:2011-03-04 13:12:06
【问题描述】:

我在 foreach 循环中通过引用访问数组,但 unset() 函数似乎不起作用:

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

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

想法?谢谢!

【问题讨论】:

    标签: php arrays reference foreach unset


    【解决方案1】:

    您正在取消设置参考(破坏参考)。您需要根据密钥取消设置:

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

    【讨论】:

    • 值得注意的是数组索引被保留,即使你在数组初始化时没有指定它们(自动数字索引)。也就是说,它不会将数字数组键重新组织为顺序。
    【解决方案2】:
    foreach ($this->result['list'] as $key => &$row) {
        if ($this_row_is_boring) {
            unset($this->result['list'][$key]);
        }
    }
    unset($row);
    

    记住:如果您使用带有引用的foreach,您应该使用 unset 取消引用,这样foreach 就不会在其上复制下一个。 More info

    【讨论】:

    • 嗯,如果您使用带有引用的 foreach,则无需在每个循环中取消设置它。 PHP 会自动为您执行此操作。您应该在 循环之后取消引用它。
    • 那是真的......这是一个错字。
    【解决方案3】:

    对上述答案的一点解释。

    unset($row) 之后,变量$row 未设置。这并不意味着删除$row 中的数据;该列表还有一个指向$row的元素。

    将变量视为标签会有所帮助。一条数据可以有一个或多个标签,unset 删除该标签但不触及实际数据。如果删除所有标签,则数据将自动删除。

    【讨论】:

      猜你喜欢
      • 2013-10-23
      • 2011-02-20
      • 2011-01-01
      • 2019-04-13
      • 2017-05-05
      • 2013-04-11
      • 2015-03-07
      • 2012-02-15
      • 2019-05-11
      相关资源
      最近更新 更多