下面php代码输出结果

<?php
$arr = ['a', 'b', 'c', 'd'];

foreach ($arr as $k => $v) {
    $v =& $arr[$k];
}

var_dump($arr);
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

$v = &$arr[0] 的执行过程是,将 $arr 的内存地址交给 $v

file

foreach 执行到下标1 时,($arr as $k => $v) 此时 $v 被赋值为 'b',由于 $v 中保存的是地址值,于是顺着地址值,将 $arr[0] 改成 'b'。

当执行到 $v = &arr[1] 时,又是引用传递,将 $arr[1] 的内存地址交给 $v,此时 $v 不再指向 $arr[0]

file

所以该题的重点是 1. 地址值和值 2. $v 被赋值是 foreach($arr as $k => $v) 时

1年前 评论
日出 1年前
讨论数量: 4
['a', 'b']

1 第一次循环
//$k=0
//$v='a'
//$arr[$k]='a'

//$v =& $arr[$k]; 执行后
//$k=0
//$v='a'地址
//$arr[$k]='a'地址
[
    0 => 'a'的地址
    其他不变
]
2 第二次循环

//$k=1
//$v='b' (在第一次循环时 $v是'a'的地址  所以此刻'a'地址的值已经被修改成'b' 但是$arr[0] 也是地址赋值  也就是说指向的是'a'的地址   所以此刻$arr[0]的值也是  b)
//$arr[$k]='a'

//$v =& $arr[$k]; 执行后
//$k=0
//$v='a'地址
//$arr[$k]='a'地址
[
    0 => 'a'的地址 => 'b'
    1 => 'b'的地址
    其他不变
]

以此类推
1年前 评论

:joy: 其实把循环执行过程拆开来看就清晰了,就是把下一数组元素赋值到上一个元素的地址中
$v = $arr[0];
$v = &$arr[0];
$v = $arr[1];
$v = &$arr[1];
$v = $arr[2];
$v = &$arr[2];
$v = $arr[3];
$v = &$arr[3];

1年前 评论

$v = &$arr[0] 的执行过程是,将 $arr 的内存地址交给 $v

file

foreach 执行到下标1 时,($arr as $k => $v) 此时 $v 被赋值为 'b',由于 $v 中保存的是地址值,于是顺着地址值,将 $arr[0] 改成 'b'。

当执行到 $v = &arr[1] 时,又是引用传递,将 $arr[1] 的内存地址交给 $v,此时 $v 不再指向 $arr[0]

file

所以该题的重点是 1. 地址值和值 2. $v 被赋值是 foreach($arr as $k => $v) 时

1年前 评论
日出 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!