我在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
之前一样长。是什么给了什么?
答案 0 :(得分:3)
您的函数中的$arr
不与$a
相同的数组。除非您pass it by reference,否则将创建本地副本,例如
function shift(&$arr) ...
检查the PHP documentation on variable scope:
但是,在用户定义的函数中,引入了本地函数范围。函数内使用的任何变量默认都限制在本地函数范围内。
array_shift
按照您期望的方式工作。执行print_r($arr);
后,可以在函数内添加array_shift
,以查看函数范围内数组的缩短版本。除非您通过引用传递它,否则它不会影响原始数组。