关于奇矩互动奇矩互动招贤纳士奇矩互动优质虚拟主机Discuz!商业用户享有本站VIP服务LAMP环境配置手册(CentOS5.1)
发新话题
打印

PHP 神奇的引用

PHP 神奇的引用

<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
    $value = $value * 2;
}
print_r($arr);
echo '<hr />';
foreach ($arr as $value) {
    $value = $value * 2;
}
print_r($arr);

?>

能猜到执行结果么?


Array ( [0] => 2 [1] => 4 [2] => 6 [3] => 8 )
--------------------------------------------------
Array ( [0] => 2 [1] => 4 [2] => 6 [3] => 24 )

Why?
真正的尊敬,既不属于那些批评别人头头是道的人,也不是属于给强人指出过错、指点别人哪里做的不好的人。真正的尊敬,是属于那些勇于亲身投入战场,脸上沾满了尘土、汗水和鲜血的奋斗者们。他们坚持不懈的努力,尽管曾经犯下错误,并一再失败,但他们满怀激情,执著不懈,将生命奉献于崇高的事业。他们为经过艰辛努力最终取得的伟大成就而自豪,如果失败,他们也败得荣耀。因此,那些既没赢得过胜利,也没懂得什么叫做失败的,冷漠、胆怯的灵魂,是永远也无法与这些真正值得尊敬的人相提并论的。
http://www.cnedwin.com

TOP

第一个循环: 将$arr = array(1, 2, 3, 4) 的元素逐一引用传递给$value 再经过 $value *= 2的赋值 $arr数组元素同时被改变 循环结束时 $value的内存地址和$arr[3]是一致的
第二个循环: 将新的$arr = array(2, 4, 6, 8) 的元素逐一值传递给$value 此时由于$value的内存地址与$arr[3]一致 所以经过 $value *= 2 实际改写了 $arr[3]的值 所以$arr[3] 依次变化 4=>8=>12=>24 如果还不能明白 可以看一下以下代码的运行结果
复制内容到剪贴板
代码:
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
    $value = $value * 2;
}
print_r($arr);
echo '<hr />','<hr />';
foreach ($arr as $value) {
    $value = $value * 2;
    print_r($arr);
    echo '<hr />';
}
本帖最近评分记录
  • lulu 威望 +5 我很赞同 2008-6-5 23:58

TOP

BS某陆
老大多一些这种内容 可以学不少东西 咔咔

TOP

手册里有说到,嘿嘿
除非数组是被引用,foreach 所操作的是指定数组的一个拷贝,而不是该数组本身。因此数组指针不会被 each() 结构改变,对返回的数组单元的修改也不会影响原数组。不过原数组的内部指针的确在处理数组的过程中向前移动了。假定 foreach 循环运行到结束,原数组的内部指针将指向数组的结尾。

自 PHP 5 起,可以很容易地通过在 $value 之前加上 & 来修改数组的单元。此方法将以引用赋值而不是拷贝一个值。
真正的尊敬,既不属于那些批评别人头头是道的人,也不是属于给强人指出过错、指点别人哪里做的不好的人。真正的尊敬,是属于那些勇于亲身投入战场,脸上沾满了尘土、汗水和鲜血的奋斗者们。他们坚持不懈的努力,尽管曾经犯下错误,并一再失败,但他们满怀激情,执著不懈,将生命奉献于崇高的事业。他们为经过艰辛努力最终取得的伟大成就而自豪,如果失败,他们也败得荣耀。因此,那些既没赢得过胜利,也没懂得什么叫做失败的,冷漠、胆怯的灵魂,是永远也无法与这些真正值得尊敬的人相提并论的。
http://www.cnedwin.com

TOP

实际上分开来做,只写第二段,是没有效果的,但收到第一次的影响,指针偏移了,所以结果就不对了
在第二个foreach前unset($value);,结果就是正确的了
真正的尊敬,既不属于那些批评别人头头是道的人,也不是属于给强人指出过错、指点别人哪里做的不好的人。真正的尊敬,是属于那些勇于亲身投入战场,脸上沾满了尘土、汗水和鲜血的奋斗者们。他们坚持不懈的努力,尽管曾经犯下错误,并一再失败,但他们满怀激情,执著不懈,将生命奉献于崇高的事业。他们为经过艰辛努力最终取得的伟大成就而自豪,如果失败,他们也败得荣耀。因此,那些既没赢得过胜利,也没懂得什么叫做失败的,冷漠、胆怯的灵魂,是永远也无法与这些真正值得尊敬的人相提并论的。
http://www.cnedwin.com

TOP

手册上有说明 不过类似一些算法 小技巧之类的 可以出一些题目让大家做做 或者像这个贴一样 一段代码让大家分析结果为什么会这样 呵呵 时间允许的情况下~~

TOP

引用:
原帖由 习明 于 2008-6-6 11:05 发表
手册上有说明 不过类似一些算法 小技巧之类的 可以出一些题目让大家做做 或者像这个贴一样 一段代码让大家分析结果为什么会这样 呵呵 时间允许的情况下~~
那以后我经常给大家出题咯
真正的尊敬,既不属于那些批评别人头头是道的人,也不是属于给强人指出过错、指点别人哪里做的不好的人。真正的尊敬,是属于那些勇于亲身投入战场,脸上沾满了尘土、汗水和鲜血的奋斗者们。他们坚持不懈的努力,尽管曾经犯下错误,并一再失败,但他们满怀激情,执著不懈,将生命奉献于崇高的事业。他们为经过艰辛努力最终取得的伟大成就而自豪,如果失败,他们也败得荣耀。因此,那些既没赢得过胜利,也没懂得什么叫做失败的,冷漠、胆怯的灵魂,是永远也无法与这些真正值得尊敬的人相提并论的。
http://www.cnedwin.com

TOP

发新话题