php销毁指针,PHP指针行为异常

在进行检查Laravel模型是否相互关联的项目时,我注意到PHP发生了一些(奇怪的?)指针行为.下面是一个重现我发现的最小示例.

$arr = ['a', 'b', ['c']];

foreach($arr as &$letter) {

if (!is_array($letter)) {

$letter = [$letter];

}

}

dump($arr);

foreach($arr as $letter) {

dump($arr);

}

function dump(...$dump) {

echo '

';

var_dump($dump);

echo '

';

}

起初,我希望此响应中的转储全部返回相同的数据:

[ ['a'], ['b'], ['c'] ]

但是事实并非如此,我得到了以下回应:

[ ['a'], ['b'], ['c'] ]

[ ['a'], ['b'], ['a'] ]

[ ['a'], ['b'], ['b'] ]

[ ['a'], ['b'], ['b'] ]

可以找到一个正在运行的示例here.

指针为何如此运行?如何在第一个循环中更新$letter而不必执行$arr [$key] = $letter?

编辑:由于人们似乎误解了为什么还有第二个foreach循环,这是为了表明数组在变化而没有被重新分配

解决方法:

Reference of a $value and the last array element remain even after the foreach loop. It is recommended to destroy it by 07001.

$arr = array(1, 2, 3, 4);

foreach ($arr as &$value) {

$value = $value * 2;

}

// $arr is now array(2, 4, 6, 8)

// Without an `unset($value)`, `$value` is still a reference to the last item: `$arr[3]`

foreach ($arr as $key => $value) {

// $arr[3] will be updated with each value from $arr...

echo "{$key} => {$value} ";

print_r($arr);

}

// ...until ultimately the second-to-last value is copied onto the last value

/* output:

0 => 2 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 2 )

1 => 4 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 4 )

2 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 )

3 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 ) */

标签:php,pointers

来源: https://codeday.me/bug/20191108/2009128.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值