num=0;//test3}publicfunctionfun(){$arr=array(array('people'=>'秀玉','hobby'=>'啦啦啦'),array('people'=>'董浩','hobby'=>'HoHoHoHo'),array('people'=>'在线哲','hobby'=>'哈哈哈'),);$people='帅气';$hobby='喵喵喵';$数=0;//test1//$this->num=0;//test2$arr=array_map(function($v)use($people,$hobby){$num++;//test1//$this->num++;//test2345$v['people']=$people.$num;$v['hobby']=$hobby.$num;//test1//$v['people']=$people.$this->num;//$v['hobby']=$hobby.$this->num;//test2ortest3ortest4ortest5or测试6返回$v;},$arr);//返回$arr;foreach($arras$v){$num++;$v['people']=$people.$num;$v['爱好']=$爱好.$num;}返回$arr;}}$test=newTest();var_dump($test->fun());?>上面代码的目的是为了让变量在回调中自增,测试后除掉内部变量fun函数只有++一次,其他类的属性不存在这个作用域问题!foreach没有这样的范围问题!原理很简单。这里array_map使用了一个匿名回调函数。回调函数的层级应该和fun方法一样,但是匿名闭包使得回调函数写在了array_map中。$num变量是fun函数的内部变量,它的作用域在fun函数中。综上所述,回调函数和fun函数是一个级别的。所以$num在回调函数中不起作用。因此,它不能递增。同样,类的属性作用域在fun函数也是一个回调函数!回调非匿名使用场景原理如下:num=0;//test3}publicfunctioncallBack($v,$rV){$this->num++;$v['人']=$rV['人'].$this->num;$v['爱好']=$rV['爱好'].$this->num;返回$v;}公共functionfun(){$arr=array(array('people'=>'秀玉','hobby'=>'啦啦啦'),array('people'=>'东浩','hobby'=>'呼呼hoo'),array('people'=>'在线哲','hobby'=>'哈哈哈'),);$数=0;//test1$replace=array(array('people'=>'帅气','hobby'=>'喵喵喵'),array('people'=>'帅气','hobby'=>'喵喵喵喵喵'),array('people'=>'帅气','hobby'=>'喵喵喵'),);$arr=array_map(array($this,'callBack'),$arr,$replace);返回$arr;}}$test=newTest();var_dump($test->fun());?>上面的array_map函数不容易过计数器,所以用array_walkarray_walkclass的属性num=0;//test3}publicfunctioncallBack($v,$k){$this->num++;var_dump($this->num.':'.$k.'=>'.$v);}publicfunctionfun(){$arr=array('people'=>'秀玉','hobby'=>'啦啦啦');array_walk($arr,array($this,'callBack'));}}$test=newTest();$test->fun();?>array_walklocalinsidethefunfunctionVariable:'.$v);}publicfunctionfun(){$arr=array('people'=>'秀玉','hobby'=>'啦啦啦');$数=0;array_walk($arr,array($this,'callBack'),$num);}}$test=newTest();$test->fun();?>array_walkfun函数中的局部变量导致探索array_walk和array_map的底层实现※很多帖子都说array_walk是一样的foreach,这样看起来不一样。使用时要小心!
