招聘标签(空格分隔):招聘PHP国贸语言基础foreach语法结构提供了一种简单的数组遍历方式。在php5之前,foreach只能用于数组php5+,foreach可以用来遍历对象。foreach只能应用于数据和对象。如果您尝试将其应用于其他数据类型的变量或未初始化的变量,则会发出错误消息。有两种语法:/*遍历给定的array_expression数据。在每次循环中,将当前元素的值赋值给$value并将数组内部的指针向前移动一步(所以下一次循环会得到下一个元素)*/foreach(array_expressionas$value){//statement}foreach(array_expressionas$value)://statementendforeach;/*同上,只是当前单元格的键名也会赋值给变量$key*/foreach(array_expressionas$key=>$value)在每个循环中{//statement}foreach(array_expressionas$key=>$value)://statementendforeach;还可以自定义遍历对象!当foreach开始执行时,数组内部的指针会自动指向第一个单元。这意味着您不需要在foreach循环之前调用reset()。由于foreach依赖于内部数组指针,因此在循环中修改其值可能会导致意外行为。在$value前加&即可轻松修改数组元素。此方法将通过引用分配值,而不是复制值。&$v){$v=$v*2;}foreach($arras$k=>$v){echo$v,PHP_EOL;}/*Output:244*/我们可以认为foreach($arras&$v)structure隐含如下操作,将数组的当前key和value分别赋值给$k和$v。具体扩展如下:$v){$k=currentKey();$v=当前值();//继续运行用户代码}根据上面的理论,现在我们重新分析第一个foreach:loopremark$arrvalueloop1-1由于$v是引用,所以$v=&$arr[0],$v=$v*2等同于$arr[0]*2[2,2,3]循环1-2$v=&$arr[1][2,4,3]循环1-3$v=&$arr[2][2,4,6]循环2-1隐式操作$v=$arr[0]被触发,因为此时$v仍然是对$arr[2]的引用,即相当于$arr[2]=$arr[0][2,4,2]循环2-2$v=$arr[1],即$arr[2]=$arr[1][2,4,4]循环2-3$v=$arr[2],即$arr[2]=$arr[2][2,4,4]这种题怎么解呢?PHP手册中有提醒:Warning:thelastoneinthearray该元素的$value引用在foreach循环之后仍然存在。推荐使用unset()销毁。&$v){$v=$v*2;}unset($v);foreach($arras$k=>$v){echo$v,PHP_EOL;}/*Output:246*/从这个问题可以看出,引用很可能有副作用。如果不想无意修改导致数据内容发生变化,最好及时取消设置这些引用。问题2:为什么下面代码的结果不是0=>a1=>b2=>c$v){echokey($arr),"=>",current($arr),PHP_EOL;}foreach($arras$k=>&$v){回显键($arr),"=>",当前($arr),PHP_EOL;}/*#php5.61=>b1=>b1=>b1=>b2=>c=>#php70=>a0=>a0=>a0=>a0=>a0=>a*/根据手册,key和current分别是获取数据中当前元素的键值。那为什么key($arr)总是0,而current($arr)总是'a'呢?先用vld查看编译后的操作码:?demo/usr/local/Cellar/php/7.2.7/bin/php-dvld.active=1a.php找到入口点分支分析从位置:0跳转找到。(代码=77)位置1=2,位置2=15从位置开始的分支分析:找到2个跳转。(代码=78)位置1=3,位置2=15从位置开始的分支分析:找到3个跳转。(代码=42)Position1=2Branchanalysisfromposition:2Branchanalysisfromposition:15Jumpfound.(Code=62)Position1=-2Branchanalysisfromposition:15filename:/Users/jianyong/demo/a.phpfunctionname:(null)numberofops:17compiledvars:!0=$arr,!1=$v,!2=$kline#*EIOopfetchext返回操作数----------------------------------------------------------------------------------20E>ASSIGN!0,<数组>41>FE_RESET_R$4!0,->152>>FE_FETCH_R~5$4,!1,->153>ASSIGN!2,~554INIT_FCALL'key'5SEND_VAR!06DO_ICALL$77ECHO$78ECHO'%3D%3E'9INIT_FCALL'当前'10SEND_VAR!011DO_ICALL$812ECHO$813ECHO'%0A'14>JMP->215>FE_FREE$4716>RETURN1branch:#0;行:2-4;酸碱度:0;工作人员:1;输出1:2;输出2:15分支:#2;行:4-4;肥皂:2;工作人员:2;输出1:3;输出2:15分支:#3;行:4-5;肥皂:3;工作人员:14;输出1:2分支:#15;行:5-7;酸碱度:15;工作人员:16;out1:-2path#1:0,2,3,2,15,path#2:0,2,15,path#3:0,15,0=>a0=>a0=>aPHP7newfeatureforeach[x]foreach循环不再对数组的内部指针起作用。PHP7之前,通过foreach遍历数据时,数组指针会移动
