软件开发的过程中,细节处理非常重要,说得大一点就是细节决定成败,别人不懂的地方,你懂,别人没注意到的细节,你注意到了,这就是你胜出对方的地方,这样就体现出了你的价值。

下面是几个foreach循环中引用相关的例子,有时候去一家公司面试的时候有可能会遇到类似的笔试题。

 //test1
$items = array(1,2,3,4,5);
foreach ($items as &$item1) {
echo "item1: $item1" . l;
}
$item1 = 3;
print_r($items);
foreach ($items as $item2) {
echo "item2: $item2" . l;
} //test2
$arr = array("1"=>"111","2"=>"222","3"=>"333");
foreach($arr as $key=>$value)
{
echo $key."=>".$value."\n";
$key = &$arr[$key];
print_r($arr);
}
代码解释:
我们发现,原来的数组被修改了,是为什么呢?我们来研究一下。
代码中关键的地方是:$key = &$arr[$key];
$key 为 $arr[$key] 的引用,也就是,当$key 被修改的时候,$arr[$key] 也被修改为对应的值。
 
首先,我们要了解一下,foreach 的原理,它是将数组的值,分别赋值给$key 和 $value ;
所以,$key ,$value 也是普通的一个变量。
 
接着分析,第一遍循环时,$key = &$arr[$key];意思是 &$arr[1] 指向$key 这个变量。
foreach 循环到第二遍的时候,首先,$key 被赋值为2,此时,再关注一下,$key = &$arr[$key];
结果是:$arr[1] 被赋值为此时的新的$key ,也就是2.
第二遍循环结束后,原来的数组变为:
Array
(
    [1] => 2
    [2] => 222
    [3] => 333
)
 
同理,第三次循环结束后,则为:
Array
(
    [1] => 2
    [2] => 3
    [3] => 333
)
 
到此,已经大概说明白了。
 
 //test3
$arr = array("1"=>"111","2"=>"222","3"=>"333");
foreach($arr as $key=>$value)
{
$key = &$arr[$key];
$key = "hello";
unset($key);
print_r($arr);
}
代码解释:
我们直接在每次循环中,给$key 赋值为 “hello ”,为了不影响,然后,把$key 变量释放掉。
这样应该,就比较清楚了吧。

输出如下:

 输出如下:
test1
item1: 1
item1: 2
item1: 3
item1: 4
item1: 5
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 3
)
item2: 1
item2: 2
item2: 3
item2: 4
item2: 3 test2
1=>111
Array
(
[1] => 111
[2] => 222
[3] => 333
)
2=>222
Array
(
[1] => 2
[2] => 222
[3] => 333
)
3=>333
Array
(
[1] => 2
[2] => 3
[3] => 333
) test3
Array
(
[1] => hello
[2] => 222
[3] => 333
)
Array
(
[1] => hello
[2] => hello
[3] => 333
)
Array
(
[1] => hello
[2] => hello
[3] => hello
)

延伸阅读:
http://www.baidu.com/s?wd=php%20foreach%20引用
http://www.sogou.com/web?query=php%20foreach%20引用
http://www.so.com/s?q=php%20foreach%20引用
http://blog.sina.com.cn/s/blog_6e322ce70100xx1t.html

PHP中foreach有关引用的问题的更多相关文章

  1. php中foreach使用引用的陷阱

    有时候我们为了在循环过程中改变数组项的值,在foreach的时候变量入口可以加个&符合, 表示,循环过程中使用数组中原来的值,而不是一个复制的值,如 foreach ($array as &a ...

  2. PHP中的&传值引用的问题,在foreach循环的结果能帮解释下输出的结果原理是什么?

    PHP中的&传值引用的问题,在foreach循环的结果能帮解释下输出的结果原理是什么? 代码如下: <?php $arr = array('one','two','three'); fo ...

  3. JavaScript中forEach的用法相关

    首先说下JavaScript的forEach的标准格式. 为数组中的每个元素执行指定操作. array1.forEach(callbackfn[, thisArg]) 参数 定义 array1 必需. ...

  4. PHP和Java中foreach循环的用法区别

    1.foreach语句介绍: ①PHP: foreach 语法结构提供了遍历数组的简单方式.foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息. ...

  5. php中foreach源码分析(编译原理)

    php中foreach源码分析(编译原理) 一.总结 编译原理(lex and yacc)的知识 二.php中foreach源码分析 foreach是PHP中很常用的一个用作数组循环的控制语句.因为它 ...

  6. Java 8 中的方法引用,轻松减少代码量,提升可读性!

    1. 引言 Java8中最受广大开发中喜欢的变化之一是因为引入了 lambda 表达式,因为这些表达式允许我们放弃匿名类,从而大大减少了样板代码,并提高了可读性. 方法引用是lambda表达式的一种特 ...

  7. 『动善时』JMeter基础 — 40、JMeter中ForEach控制器详解

    目录 1.什么是逻辑控制器 2.ForEach控制器介绍 3.ForEach控制器的使用 (1)测试计划内包含的元件 (2)获取学院列表请求内容 (3)JSON提取器内容 (4)ForEach控制器内 ...

  8. 重新想象 Windows 8.1 Store Apps (81) - 控件增强: WebView 之加载本地 html, 智能替换 html 中的 url 引用, 通过 Share Contract 分享 WebView 中的内容, 为 WebView 截图

    [源码下载] 重新想象 Windows 8.1 Store Apps (81) - 控件增强: WebView 之加载本地 html, 智能替换 html 中的 url 引用, 通过 Share Co ...

  9. ecshop中foreach的详细用法归纳

    ec模版中foreach的常见用法. foreach 语法: 假如后台:$smarty->assign('test',$test); {foreach from=$test item=list ...

随机推荐

  1. 【转载】ubuntu16.04 无线/Wifi 上网速度慢的解决方法

    原文链接:http://tieba.baidu.com/p/4737599703[侵删] 一直以为是域名解析的问题,可也觉得不像.今天在百度搜索“ubuntu16.04域名解析慢”的时候无意中看到了h ...

  2. 移动web页面字体大小三

    <script type="text/javascript"> (function (doc, win) { var docEl = doc.documentEleme ...

  3. .net core webapi jwt 更为清爽的认证 ,续期很简单(2)

    .net core webapi jwt 更为清爽的认证  后续:续期以及设置Token过期 续期: 续期的操作是在中间件中进行的,续期本身包括了前一个Token的过期加发放新的Token,所以在说续 ...

  4. HashMap排序的问题

    那么已知一个HashMap<Integer,User>集合, User有name(String)和 age(int)属性.请写一个方法实现对HashMap 的排序功能,该方法接收 Hash ...

  5. 转 linux socket的select函数例子

    使用select函数可以以非阻塞的方式和多个socket通信.程序只是演示select函数的使用,功能非常简单,即使某个连接关闭以后也不会修改当前连接数,连接数达到最大值后会终止程序. 1. 程序使用 ...

  6. 30分钟学会如何使用Shiro(转)

    本文转自http://www.cnblogs.com/learnhow/p/5694876.html 感谢作者 本篇内容大多总结自张开涛的<跟我学Shiro>原文地址:http://jin ...

  7. DELPHI跨平台的临界替代者

    在WINDOWS里面使用临界来保护多线程需要访问的共享对象,现在,DELPHI有了新的跨平台临界保护者--System.TMonitor 代码演示如下: FConnections := TObject ...

  8. dubbo-admin安装和使用

    更新下链接,不知道是不是这个项目合入Apache的缘故,链接都变成了https://github.com/apache/incubator-dubbo/ 按照常理,直接去 https://github ...

  9. 从CLR GC到CoreCLR GC看.NET Core对云原生的支持

    内存分配概要 前段时间在园子里看到有人提到了GC学习的重要性,很赞同他的观点.充分了解GC可以帮助我们更好的认识.NET的设计以及为何在云原生开发中.NET Core会占有更大的优势,这也是一个程序员 ...

  10. 问题解决:FFmpeg视频编解码库,无法解析的外部信号

    在编译FFmpeg相关项目时.可能会出现: error LNK2019: 无法解析的外部符号 "int __cdecl avpicture_fill(struct AVPicture *,u ...