我应该在每个 foreach 语句之后取消设置 `$key` 和 `$value` 吗?

Posted

技术标签:

【中文标题】我应该在每个 foreach 语句之后取消设置 `$key` 和 `$value` 吗?【英文标题】:Should I unset both `$key` and `$value` after every foreach statement? 【发布时间】:2018-06-09 05:18:12 【问题描述】:

我找到的所有答案都只涉及解除$value 的问题,除了一个我不清楚的答案。所以我在这里。说我有这条线:

foreach ($data as $key => $value)
    
    // do stuff
    

我应该把这两行放在后面吗?

unset($key);
unset($value);

或者我可以省略unset($key)?此外,是否建议在每个 foreach 之后始终使用 unset?假设我嵌套了foreach 循环,如下所示:

foreach ($data as $key => $value)
    
        foreach ($data[$key] as $key => $value)
        
        // do stuff
        
        unset($key);
        unset($value);
    
    unset($key);
    unset($value);

嵌套的unset() 函数是否会干扰***别的foreach?也就是说,嵌套的$key$value和***的$key$value一样吗?

【问题讨论】:

也没有需要取消设置。你想完成什么? 我正在使用foreach 循环来创建具有唯一值的键数组,但是某些键被分配了与在它们之前以不可预知的方式创建的键相同的值,而我没有在我的整个代码中只有一个 unset(),所以我怀疑这就是原因。 对嵌套的 foreach 循环使用不同的变量。 foreach($data as $k => $v) 在循环之后不调用unset 的唯一常见缺点是,如果您是通过引用循环的,而您不是。否则,变量要么被其他东西覆盖,要么超出范围。如果你在嵌套循环中使用相同的变量名,那你就是自找麻烦。 感谢@GrumpCrouton,这似乎很容易解决。谢谢。 【参考方案1】:

问题的解决方案比您想象的要容易。

只需更改嵌套循环的变量名称,如下所示:

foreach ($data as $key => $value) 
    foreach ($value as $subkey => $subvalue) 
        // do stuff
    

通过上面的代码,您可以分别以$subkey$subvalue 访问来自$date[$key](实际上等于父循环内的$value)的数组数据。

您还可以分别使用$key$value 在父foreach 循环内的任何位置访问父循环数据。

【讨论】:

以上是关于我应该在每个 foreach 语句之后取消设置 `$key` 和 `$value` 吗?的主要内容,如果未能解决你的问题,请参考以下文章

通过嵌套的 foreaches 取消设置多维数组中的键

为啥我不能在“foreach”循环中取消设置变量?

为啥我需要在 foreach 循环后取消设置 $value

PHP - 在foreach循环中取消设置数组元素[重复]

C#中foreach用法

如何在 SwiftUI 的 foreach 循环中设置切换状态