PHP   发布时间:2022-04-04  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了PHP指针行为异常大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

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

<?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 '<pre>';
    var_dump($dump);
    echo '</pre>';  
}

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

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

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

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

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

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

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

解决方法:

根据PHP documentation

$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指针行为异常全部内容,希望文章能够帮你解决PHP指针行为异常所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: