资讯专栏INFORMATION COLUMN

array_map回调函数内部变量作用域分享

rozbo / 2232人阅读

摘要:修宇拉拉拉栋浩吼吼吼上线哲哈哈哈帅奇喵喵喵如上目的为在回调用使变量自增经测除函数内部变量只被一次其余类的属性均无此作用域问题无该作用域问题想来原理很简单这里用的是匿名回调函数回调函数的层级本就与方法应相同只不过匿名闭包使回调函数

num = 0; //test3
    }
    
    public function fun()
    {
        $arr = array(
            array("people" => "修宇","hobby" => "拉拉拉"),
            array("people" => "栋浩","hobby" => "吼吼吼"),
            array("people" => "上线哲","hobby" => "哈哈哈"),
        );
        $people = "帅奇";
        $hobby = "喵喵喵";
        
        $num = 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;    //test2 or test3 or test4 or test5 or test6
            return $v;
        },$arr);
        // return $arr;
        
        foreach($arr as $v) {
            $num++;
            $v["people"] = $people.$num;
            $v["hobby"] = $hobby.$num;
        }
        return $arr;
    }
}
$test = new Test();
var_dump($test->fun());
?>

如上code 目的为在回调用使变量自增 , 经测除fun函数内部变量只被++一次 其余类的属性均无此作用域问题 !
foreach 无该作用域问题 !
想来原理很简单 这里array_map用的是匿名回调函数 . 回调函数的层级本就与fun方法应相同 , 只不过匿名闭包使回调函数写在array_map中.
$num变量为fun函数内部变量 , 其作用域再fun函数内. 综上所述回调函数与fun函数同级. 故$num并不作用在回调函数内. 故无法自增.
同理类的属性作用域即在fun函数也在回调函数 !

回调非匿名使用场景原理如下 :

num = 0; //test3
    }
    
    public function callBack($v, $rV) {
        $this->num++;
        $v["people"] = $rV["people"].$this->num;
        $v["hobby"] = $rV["hobby"].$this->num;
        return $v;
    }
    
    public function fun()
    {
        $arr = array(
            array("people" => "修宇","hobby" => "拉拉拉"),
            array("people" => "栋浩","hobby" => "吼吼吼"),
            array("people" => "上线哲","hobby" => "哈哈哈"),
        );
    
        $num = 0;    //test1
       
        $replace = array(
            array("people" => "帅奇", "hobby" => "喵喵喵"),
            array("people" => "帅奇", "hobby" => "喵喵喵"),
            array("people" => "帅奇", "hobby" => "喵喵喵"),
        );
        $arr = array_map(array($this,"callBack"),$arr, $replace);
        return $arr;
    }
}
$test = new Test();
var_dump($test->fun());
?>

上述array_map函数想传计数器都不好传 , 于是使用array_walk
array_walk 类的属性

num = 0; //test3
    }
    
    public function callBack($v, $k) {
        $this->num++;
        var_dump($this->num.":".$k."=>".$v);
    }
    
    public function fun()
    {
        $arr = array("people" => "修宇","hobby" => "拉拉拉");
        array_walk($arr, array($this,"callBack"));
    }
}
$test = new Test();
$test->fun();
?>

array_walk fun函数内的局部变量 :

".$v);
    }
    
    public function fun()
    {
        $arr = array("people" => "修宇","hobby" => "拉拉拉");
        
        $num = 0;
        
        array_walk($arr, array($this, "callBack"), $num);
    }
}
$test = new Test();
$test->fun();
?>

由array_walk fun函数内的局部变量情况 就引发array_walk、和array_map底层实现的探究
※很多帖子说array_walk与foreach一样 , 这么看不一样 . 使用时要注意 !

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/28450.html

相关文章

  • PHP新特性之闭包、匿名函数

    摘要:闭包闭包是什么闭包和匿名函数在中被引入。可以将匿名函数和闭包视作相同的概念。闭包和字符串或整数一样,是一等值类型。何时使用我们通常把闭包当做函数和方法的回调使用。 闭包 闭包是什么? 1).闭包和匿名函数在PHP5.3中被引入。2).闭包是指在创建时封装函数周围状态的函数,即使闭包所在的环境不存在了,闭包封装的状态依然存在,这一点和Javascript的闭包特性很相似。3).匿名函数就...

    luzhuqun 评论0 收藏0
  • PHP 7.4 新语法:箭头函数

    摘要:原因如下短闭包的目的是为了减少冗余。然而,的创建者认为,如果你要处理的是多行表达式的函数,那么使用闭包获得的益处就更少了。这意味着你可以改变短闭包内的变量,但它不会对外部作用域中的变量产生影响。 showImg(https://segmentfault.com/img/remote/1460000019117465?w=722&h=350);短闭包,也叫做箭头函数,是一种用 php 编...

    darcrand 评论0 收藏0
  • JavaScript面向对象中的Function类型个人分享

    摘要:类型与函数的概念函数这样的一段代码它只定义一次但是可能被执行或调用多次类型是提供的引用类型之一通过类型创建对象在中函数也是对象的形式存在注意每个函数都是以个对象与函数函数声明方式示例代码一笑一人生字面量方式示例代码一花一世界判断函数是否为类 Function类型 Function与函数的概念 函数这样的一段JavaScript代码,它只定义一次,但是可能被执行或调用多次 Functi...

    LeviDing 评论0 收藏0
  • array_map 等php回调函数使用问题(关联数组下标获取)

    摘要:前言我自己用此类回调函数,来替代纯粹是用为代码的简洁性,让代码更好看。我有点代码小洁癖当迭代处理一个一维索引数组时,在回调函数内是无法获取到当时元素索引的。目的在回调体内获取迭代关联数组的下标值。 前言:我自己用此类回调函数,来替代 foreach 纯粹是用为代码的简洁性,让代码更好看。(我有点代码小洁癖~) 1、array_reduce 当迭代处理一个一维索引数组时,在回调函数内是无...

    shiweifu 评论0 收藏0
  • PHP提取多维数组指定一列的方法大全

    摘要:中对多维数组特定列的提取,是个很常用的功能,正因为如此,在版本之后,添加了一个专用的函数。变种方法如下,意为把数组的每一项值的开头值移出,并获取移除的值作为新数组。注意此时新数组的键仍是原数组的键,如下。 PHP中对多维数组特定列的提取,是个很常用的功能,正因为如此,PHP在5.5.0版本之后,添加了一个专用的函数array_column()。当然,如果你的PHP版本低于5.5.0,就...

    roundstones 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<