PHP使用foreach报错出错

在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
foreach($arr as $value){
$value=preg_replace("/href=\"\//i",'href="'.$link,$value);
echo $value."&/br&";//此处$value为替换之后的值。
echo $arr[1];//此处显示的仍为替换前$arr[1]的值。
//请问这个是怎么回事呢?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
foreach($arr as &$value){
$value=preg_replace("/href=\"\//i",'href="'.$link,$value);
echo $value."&/br&";//此处$value为替换之后的值。
echo $arr[1];//此处显示的仍为替换前$arr[1]的值。
由于变量作用域的原因,如果你在里面修改了值,且需要保存结果,需要将类型定义为引用类型,即&。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
你只是对在循环体内对局部变量$value做了个replace操作,并没有把value还给$arr.
foreach($arr as $key =& $value){
$value=preg_replace("/href=\"\//i",'href="'.$link,$value);
$arr[$key] = $
echo $value."&/br&";//此处$value为替换之后的值。
echo $arr[1];//此处显示的仍为替换前$arr[1]的值。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
foreach($arr as $key=&$value){
$arr[$key]=preg_replace("/href=\"\//i",'href="'.$link,$value);
echo $arr[$key]."&/br&";//此处$value为替换之后的值。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
先弄清楚,按值传递和按引用传递吧
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。PHP for 循环
PHP for 循环
PHP for 循环执行代码块指定的次数。
PHP for 循环
如果您已经提前确定脚本运行的次数,可以使用 for 循环。
for ( increment counter) {
init counter:初始化循环计数器的值
test counter:: 评估每个循环迭代。如果值为 TRUE,继续循环。如果它的值为 FALSE,循环结束。
increment counter:增加循环计数器的值
下面的例子显示了从 0 到 10 的数字:
for ($x=0; $x&=10; $x++) {
echo &数字是:$x &br&&;
PHP foreach 循环
foreach 循环只适用于数组,并用于遍历数组中的每个键/值对。
foreach ($array as $value) {
每进行一次循环迭代,当前数组元素的值就会被赋值给 $value 变量,并且数组指针会逐一地移动,直到到达最后一个数组元素。
下面的例子演示的循环将输出给定数组($colors)的值:
$colors = array(&red&,&green&,&blue&,&yellow&);
foreach ($colors as $value) {
echo &$value &br&&;
在稍后的章节,您将学到更多有关数组的知识。&nbsp&#8250&nbsp&nbsp&#8250&nbsp
PHP foreach的两种用法 as
$key =& $value
一 foreach的语法介绍&&&&PHP 4以上的版本包括了 foreach 结构,这只是一种遍历数组简便方法。foreach 仅能用于数组,当试图将其用于其它数据类型或者一个未初始化的变量时会产生错误。有两种语法,第二种是第一种的有用的扩展。foreach(array_expression as $value) statement
foreach(array_expression as $key =& $value) statement&&&&第一种格式遍历给定的 array_expression 数组。每次循环中,当前单元的值被赋给 $value 并且数组内部的指针向前移一步(因此下一次循环中将会得到下一个单元)。&&&&第二种格式做同样的事,只是除了当前单元的值以外,键值也会在每次循环中被赋给变量 $key。看下面代码:$arr = array("1"=&"111","2"=&"222","3"=&"333");
foreach($arr as $key=&$value)
&&echo $key."=&".$value."\n";
结果如下:
3=&333&&&&键值这里可以理解为数组下标,数组元素a[2]的下标就是2.&&&&当 foreach 开始执行时,数组内部的指针会自动指向第一个单元。这意味着不需要在 foreach 循环之前调用 reset()。而while循环需要reset。下面两种代码功能完全相同。1.用while循环$arr = array("one", "two", "three");
reset ($arr);
while (list(, $value) = each ($arr)) {
echo "Value: $value&br&\n";
}2.用foreachforeach ($arr as $value) {
echo "Value: $value&br&\n";
}&&& 此外注意 foreach 所操作的是指定数组的一个拷贝,而不是该数组本身。因此即使有 each() 的构造,原数组指针也没有变,数组单元的值也不受影响。&&&&foreach 不支持用“@”来禁止错误信息的能力。二 PHP foreach 小结&&&&&1.foreach 中使用引用的情况。&&&&普通情况下,foreach($arr as $value)中的$arr和$value是拷贝,不受外部影响的,即$arr = array(0,1,2,3,4,5);
foreach($arr as $value){
&&&&$arr = array();
&&&&echo $
}&&&&结果是:12345&&&&但如果$arr是引用的话,情况则不同了,我们用代码来说明问题$arr = array(0,1,2,3,4,5);
foreach($arr as $value){
&&&&$arr = array();
&&&&echo $
}&&&&结果是: 0&&&&这是因为循环用的$arr是直接指向原数据的,而不是copy了一份。&&&&如果$value是引用,而$arr不是引用,其结果是一样的,同样$value是指向原数据的而不是copy$arr = array(0,1,2,3,4,5);
foreach($arr as &$value){
&&&&$arr = array();
&&&&echo $
}&&&&结果是: 0&&&&还有一种情况比较特殊,即是如果定义了$arr为全局变量的话,$arr也会变成引用global $
$arr = array(0,1,2,3,4,5);
foreach($arr as $value){
&&&&$arr = array();
&&&&echo $
}&& 结果是: 0&&&&&2. 如果两次循环一个数组,一定不能这样写foreach($arr as &$value){}
foreach($arr as $value){}&&&&这会导致第二次的循环的结果不正确(可能是php的bug吧)。可以用以下几种来代替://solution 1
foreach($arr as &$value){}
unset($value);
foreach($arr as $value){}
//solution 2
foreach($arr as &$value){}
foreach($arr as &$value){}
//solution 3
foreach($arr as &$value){}
foreach($arr2 as $value){}&&&&&3.防止foreach出现未定义情况,尽量这样来写foreach&&&& foreach((array)$arr as $value) {}
上一篇: 目录|../ask 文件|../ask/admin.php 目录|../ask/control 目录|../ask/control/admin 文件|../ask/control/admin/answer.php 文件|../ask/control/admin/asktype.php 文件|../ask/control/admin/issue.php 文件|../ask/control/admin/slide.php 文件|../ask/c
下一篇: dedecms有个问答平台的模块,安装该模块之后会在根目录下面生成一个ask的目录,相关的代码和模板都在里面了,当然安装过程中还在数据库中添加了和问答相关的数据。 其实模块是和系统其它部分比较独立的程序集合,我发现这个问答模块的代码结构和dede其它地方下次自动登录
现在的位置:
php中foreach()函数的用法
foreach()有两种用法:1: foreach(array_name as $value)
}这里的array_name是你要遍历的数组名,每次循环中,array_name数组的当前元素的值被赋给$value,并且数组内部的下标向下移一步,也就是下次循环回得到下一个元素。2:foreach(array_name as $key =& $value)
这里跟第一种方法的区别就是多了个$key,也就是除了把当前元素的值赋给$value外,当前元素的键值也会在每次循环中被赋给变量$key。键值可以是下标值,也可以是字符串。比如book[0]=1中的“0”,book[id]="001"中的“id”.
示范用法的更多例子:
/*-------------------------------------------------------------------------*/
/* foreach example 1: value only */
echo "foreach example 1: value only ".'&br /&';
$a = array(1, 2, 3, 17);
foreach ($a as $v) {
echo "Current value of "$a: $v".'&br /&';
/*-------------------------------------------------------------------------*/
/* foreach example 2: value (with key printed for illustration) */
echo '&br /&'.'&br /&'."foreach example 2: value (with key printed for illustration) ".'&br /&';
$a = array(1, 2, 3, 17);
$i = 0; /* for illustrative purposes only */
foreach ($a as $v) {
echo ""$a[$i] =& $v".'&br /&';
/*-------------------------------------------------------------------------*/
/* foreach example 3: key and value */
echo '&br /&'.'&br /&'."foreach example 3: key and value ".'&br /&';
$a = array(
"one" =& 1,
"two" =& 2,
"three" =& 3,
"seventeen" =& 17
foreach ($a as $k =& $v) {
echo ""$a[$k] =& $v".'&br /&';
/*-------------------------------------------------------------------------*/
/* foreach example 4: multi-dimensional arrays */
echo '&br /&'.'&br /&'."foreach example 4: multi-dimensional arrays ".'&br /&';
$a = array();
$a[0][0] = "a";
$a[0][1] = "b";
$a[1][0] = "y";
$a[1][1] = "z";
foreach ($a as $v1) {
foreach ($v1 as $v2) {
echo "$v2"n";
/*-------------------------------------------------------------------------*/
/* foreach example 5: dynamic arrays */
echo '&br /&'.'&br /&'."foreach example 5: dynamic arrays ".'&br /&';
foreach (array(1, 2, 3, 4, 5) as $v) {
echo "$v"n";
foreach example 1: value only
Current value of $a: 1
Current value of $a: 2
Current value of $a: 3
Current value of $a: 17
foreach example 2: value (with key printed for illustration)
$a[0] =& 1
$a[1] =& 2
$a[2] =& 3
$a[3] =& 17
foreach example 3: key and value
$a[one] =& 1
$a[two] =& 2
$a[three] =& 3
$a[seventeen] =& 17
foreach example 4: multi-dimensional arrays
foreach example 5: dynamic arrays
/* foreach example 3: key and value */
echo '&br /&'.'&br /&'."foreach example 3: key and value ".'&br /&';
$messageNav['首页'] =ROOT_PATH;
$messageNav['人才交流'] ="#"
$messageNav['动态专栏'] ="hragent/cn/"
&?php $i = 0;foreach ($messageNav as $key=&$value):?&
&?php if ($i != count($messageNav) - 1):?&
&a href="&?=$value?&"&&?=$key?&&/a&&
&?php else:?&
&a href="&?=$value?&" class="onlink"&&?=$key?&&/a&
&?php $i++;?&
print out result:首页&人才交流&动态专栏
【上篇】【下篇】php中我们常使用的foreach是如何实现的?php中我们常使用的foreach是如何实现的?新闻财经百家号foreach的实现foreach是PHP的关键字,用来实现基于数据的循环。基于数据循环语句的循环是由数据结构中的元素的数目来控制的。一般来说,基于数据的循环语句会使用一种称之为迭代器的函数来实现元素的遍历。循环过程的实现foreach语句在语法解析时对应三个操作:zend_do_foreach_begin: 循环开始操作,生成FE_RESET中间代码,数组会在循环开始时执行RESET操作,即我们使用foreach遍历时不用每次重新手动RESET,同时此操作也会生成获取变量的FE_FETCH中间代码。zend_do_foreach_cont:根据需要获取变量的状态判断是否引用,此处的引用会影响FE_RESET的初始化操作和FE_FETCH中间代码的获取变量操作。zend_do_foreach_end:设置ZEND_JMP中间代码,设置下一条OP,以跳出循环,结束循环,清理工作。这三个操作都是语法解析时对应的函数名,在编译过程中会直接调用。他们形成的中间代码在PHP内核执行时,形成的循环遍历效果是:在foreach遍历之前, PHP内核首先会有个FE_RESET操作来重置数组的内部指针,也就是pInternalPointer, 然后通过每次FE_FETCH将pInternalPointer指向数组的下一个元素,从而实现顺序遍历。并且每次FE_FETCH的结果都会被一个全局的中间变量存储,以给下一次的获取元素使用。当我们通过RESET初始化数组后,FETCH会获取变量,并将数组的内部指针指向一个元素。在前面我们讲过,常规情况下OPCODE的执行是一条一条依次执行的,则在FE_FETCH获取完变量后,PHP内核会依次执行后续的OPCODE,当执行到JMP时,会重新跳到-&7,即再一次获取变量,如此构成一个循环。当FE_FETCH执行失败时,会跳转到-&14,即SWITCH_FREE,从而结束整个循环。指针的意外行为在PHP手册中有这样一个NOTE:Note: 当 foreach 开始执行时,数组内部的指针会自动指向第一个单元。这意味着不需要在 foreach 循环之前调用 reset()。 由于 foreach 依赖内部数组指针,在循环中修改其值将可能导致意外的行为。这个异常引申出三个问题:为什么foreach循环体中执行key或current会显示第二个元素(非引用情况)?以key函数为例,我们执行函数调用时,会执行中间代码SEND_REF,此中间代码会将没有设置引用的变量复制一份并设置为引用。当进入循环体时,PHP内核已经经过了一次fetch操作,相当于执行了一次next操作,当前元素指向第二个元素。因此我们在foreach的循环体中执行key函数时,key中调用的数组变量为PHP执行了一次fetch操作的数组拷贝,此时foreach的内部指针指向第二个元素。为什么在foreach中执行end等操作,其循环过程不变?在遍历的代码中通过end,next等操作数组的指针,数组的指针不会变化,这是因为在PHP内核进行FETCH操作时,会通过中间变量存储当前操作数组的内部指针,每遍历一个元素,会先获取之前存储的指针位置,获取下一个元素后,再恢复指针位置,关键在于FETCH OPCODE执行过程中的中间变量。为什么$row的引用和非引用情况下输出结果不同?如果是引用,PHP内核在reset数组时,会直接分裂数组,生成一个数组的拷贝,并将其设置为引用。如果是非引用,PHP内核在reset数组时,当数组的引用计数大于1,并且不存在引用时,会拷贝数组供foreach使用,其它情况使用原数组,将其引用计数加1。因为引用的不同,在循环体中给函数传递参数时其结果不同,导致看到的foreach数组内部指针变化的不同。对于非引用且引用计数大于1的情况,其本身就是两个不同的数组,在RESET时就不同了。本文由百家号作者上传并发布,百家号仅提供信息发布平台。文章仅代表作者个人观点,不代表百度立场。未经作者许可,不得转载。新闻财经百家号最近更新:简介:耐心是致胜的关键,信心是成功的保障。作者最新文章相关文章}

我要回帖

更多关于 foreach 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信