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

Php 在foreach循环中取消设置数组元素,php,arrays,reference,foreach,unset,Php,Arrays,Reference,Foreach,Unset,我在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 想法?谢谢 您正在取消引用(断开引用)。您需要根据密钥

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

想法?谢谢

您正在取消引用(断开引用)。您需要根据密钥取消设置:

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

请记住:如果将
foreach
与引用一起使用,则应使用unset解除引用,以便
foreach
不会复制其上的下一个引用

对上面的答案有一点解释

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


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

值得注意的是,数组索引将保留,即使在初始化数组时未指定它们(自动数字索引)。也就是说,它不会将数字数组键重新组织为连续的。嗯,如果使用带有引用的foreach,则不需要在每个循环中取消设置它。PHP会自动为您做到这一点。你应该在循环结束后取消对它的引用。。。那是个打字错误。
foreach ($this->result['list'] as $key => &$row) {
    if ($this_row_is_boring) {
        unset($this->result['list'][$key]);
    }
}
unset($row);