使用array_shift混淆结果

时间:2017-07-11 21:33:32

标签: php parameter-passing

我在PHP中使用array_shift函数面临一些奇怪的行为:

function shift($arr)
{
  array_shift($arr);
}

$a = [1, 2, 3];
shift($a);
print_r($a);

输出:

Array ( [0] => 1 [1] => 2 [2] => 3 ) 

我的预期输出:

Array ( [0] => 2 [1] => 3 ) 

说明:

我相信$a$arr,尽管是不同的引用,但指向同一个数组对象。我希望array_shift看看$arr指向的位置并修改(缩短)该数组。然后,通过$a查找数组时,可以看到该更改。

然而,当我测试我的理论时,没有看到任何变化。该数组与调用array_shift之前一样长。是什么给了什么?

1 个答案:

答案 0 :(得分:3)

您的函数中的$arr $a相同的数组。除非您pass it by reference,否则将创建本地副本,例如

function shift(&$arr) ...

检查the PHP documentation on variable scope

  

但是,在用户定义的函数中,引入了本地函数范围。函数内使用的任何变量默认都限制在本地函数范围内。

array_shift 按照您期望的方式工作。执行print_r($arr);后,可以在函数内添加array_shift,以查看函数范围内数组的缩短版本。除非您通过引用传递它,否则它不会影响原始数组。