在foreach循环中取消设置数组元素

17

我在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

有什么建议吗?谢谢!

3个回答

34
您正在取消引用(打破引用)。 您需要根据键取消设置:
foreach ($this->result['list'] as $key => &$row) {
    if ($this_row_is_boring) {
        unset($this->result['list'][$key]);
    }
}

7
值得注意的是,即使在初始化数组时没有指定它们(自动数字索引),数组索引也会被保留。也就是说,它不会重新组织数字数组键以使其成为连续的。 - amphetamachine

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

请记住:如果您正在使用带有引用的 foreach,则应使用 unset 解除引用,以便 foreach 不会将下一个覆盖在其上。 更多信息


1
如果你在使用 foreach 循环时带有引用,那么你不需要在每次循环中使用 unset 去释放它。PHP 会自动为你处理这个问题。你应该在循环结束后解除引用。 - ircmaxell
没错...那是个打字错误。 - Cristian

5
上面的答案需要解释一下。
在使用unset($row)后,变量$row被取消设置。这并不意味着$row中的数据被删除;列表还有一个指向$row的元素。
将变量视为标签会有所帮助。一段数据可以有一个或多个标签,unset会删除此标签,但不会影响实际数据。如果所有标签都被删除,则数据会自动删除。

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