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

guz6ccqo  于 2023-01-19  发布在  PHP
关注(0)|答案(4)|浏览(119)

我在PHP中玩数组,我对unset()函数感到困惑,下面是代码:

<?php

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

?>

当foreach循环后$value仍然存在时,是否需要unset($value),这是一个好的做法?

3wabscal

3wabscal1#

我知道这篇文章是旧的,但我认为这个信息是非常重要的:你问:
当foreach循环后$value仍然存在时,是否需要unset($value),这是一个好的做法?
这取决于你是按值迭代还是按引用迭代

第一种情况(按值):

$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.

因此没有必要取消设置$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! )

所以在这个例子中,**取消$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]

这对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]

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

wljmcqd8

wljmcqd82#

没有必要在当前使用unset的上下文中使用它。unset只会破坏变量及其内容。
在你给出的例子中,这是循环遍历一个数组,创建$value,然后你取消设置这个变量,这意味着它不再存在于代码中,所以这完全没有任何作用。
为了形象化我所说的内容,请看下面这个例子:

$value = 'Hello World';
echo $value;
unset($value);
echo $value;

以下输出将为:

Hello World<br /><b>NOTICE</b> Undefined variable: value on line number 6<br />

因此,您将首先看到Hello World,但在取消设置该变量后,尝试调用它将只会导致错误。
要回答你的问题,你真的不需要取消价值;不需要它,因为foreach循环正在设置每个array() + 10$value
取消设置它将导致工作被删除和遗忘。

5us2dqdw

5us2dqdw3#

我可以看到不设置$value的一个原因是为了确保你不会在同一个脚本中无意中使用它。我刚刚处理了一个真正令人困惑的bug,这个bug是由于将一个循环中的几行代码复制到另一个循环中而引起的。并且它使用来自第一循环的$value的最终值。至少如果我取消了它,我会得到一个有用的错误消息,由于试图访问一个不存在的变量。

bvjxkvbb

bvjxkvbb4#

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

你可能泄露了***"&"***。

相关问题