2010-06-16 104 views
15

我通过引用访问foreach循环内的阵列内的阵列元素,但是未设定()函数似乎并不奏效:取消设置foreach循环

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

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

想法?谢谢!

回答

30

你没有设置参考(打破参考)。你需要取消设置基于键:

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

值得注意的是,即使您在初始化数组时未指定它们(自动数字索引),也会保留数组索引。也就是说,它不会将数字数组键重新组织为顺序。 – amphetamachine 2010-06-16 15:55:31

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

记住:如果您使用的是foreach与参考,你应该使用未设置取消引用,这样foreach不上复制下一个它的顶部。 More info

+1

嗯,如果你使用带参考的foreach,你不需要在每个循环中取消它。 PHP自动为你做。您应该在**循环后取消引用**。 – ircmaxell 2010-06-16 16:08:45

+0

这是真的......这是一个错字。 – Cristian 2010-06-16 16:27:07

4

上面的答案有点解释。

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

它有助于将变量看作标签。一段数据可以有一个或多个标签,并且unset删除该标签但不会触及实际数据。如果所有标签都被删除,则数据会自动删除。