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

kro*_*ger 2 php arrays foreach unset

我在 PHP 中使用数组,我对 unset() 函数感到困惑,这是代码:

<?php

$array = array(1, 2, 3, 4);
foreach ($array as $value) {
    $value + 10;
}
unset($value);
print_r($array);

?>
Run Code Online (Sandbox Code Playgroud)

是否有必要取消设置($value),当 $value 在 foreach 循环后仍然存在时,这是一种好习惯吗?

Dam*_*lez 20

我知道这篇文章很旧,但我认为这个信息非常重要:你问:

是否有必要取消设置($value),当 $value 在 foreach 循环后仍然存在时,这是一种好习惯吗?

这取决于您是按值还是按引用进行迭代。

第一种情况(按价值):

$array = array(1, 2, 3, 4);
foreach ($array as $value) {

    //here $value is 1, then 2, then 3, then 4

}

//here $value will continue having a value of 4
//but if you change it, nothing happens with your array

$value = 'boom!';
//your array doesn't change.
Run Code Online (Sandbox Code Playgroud)

所以没有必要取消设置 $value

第二种情况(参考):

$array = array(1, 2, 3, 4);
foreach ($array as &$value) {

    //here $value is not a number, but a REFERENCE.
    //that means, it will NOT be 1, then 2, then 3, then 4
    //$value will be $array[0], then $array[1], etc

}

//here $value it's not 4, it's $array[3], it will remain as a reference
//so, if you change $value, $array[3] will change

$value = 'boom!'; //this will do:  $array[3] = 'boom';
print_r ($array); //Array ( [0] => 1 [1] => 2 [2] => 3 [3] => boom! )
Run Code Online (Sandbox Code Playgroud)

因此,在这种情况下,最好取消设置 $value,因为这样做会破坏对数组的引用。有必要吗?不,但如果你不这样做,你应该非常小心。

它可能会导致意想不到的结果,如下所示:

$letters = array('a', 'b', 'c', 'd');

foreach ($letters as &$item) {}
foreach ($letters as  $item) {}

print_r ($letters); //output: Array ( [0] => a [1] => b [2] => c [3] => c )
// [a,b,c,c], not [a,b,c,d]
Run Code Online (Sandbox Code Playgroud)

这也适用于 PHP 7.0

未设置的相同代码:

$letters = array('a', 'b', 'c', 'd');

foreach ($letters as &$item) {}
unset ($item);
foreach ($letters as  $item) {}

print_r ($letters); //output: Array ( [0] => a [1] => b [2] => c [3] => d )
// now it's [a,b,c,d]
Run Code Online (Sandbox Code Playgroud)

我希望这对将来的某人有用。:)

  • 这应该是公认的答案。缺乏经验的开发人员如果不理解价值/参考的东西可能会搞砸。 (5认同)

Sam*_*Sam 2

无需unset在当前使用它的上下文中使用它。unset只会破坏变量及其内容。

在您给出的示例中,这是循环创建一个数组$value,然后您取消设置该变量。这意味着它不再存在于该代码中。所以这绝对没有任何作用。

为了形象化我所说的内容,请看这个例子:

$value = 'Hello World';
echo $value;
unset($value);
echo $value;
Run Code Online (Sandbox Code Playgroud)

以下内容将是:

Hello World<br /><b>NOTICE</b> Undefined variable: value on line number 6<br />
Run Code Online (Sandbox Code Playgroud)

因此,您将首先看到Hello World,但在取消设置该变量后尝试调用它只会导致错误。

要回答您的问题,您实际上不必取消设置值;没有必要。由于foreach循环正在设置$value每个array() + 10.

取消设置将导致工作被删除并被遗忘。

  • 仅当 $value 通过引用使用时,它才会搞砸,如下所示: `foreach ($array as &amp;$value) { $value + 10; }` (2认同)