首頁 >後端開發 >php教程 >closure - 求指导:php闭包实现数组的格式化

closure - 求指导:php闭包实现数组的格式化

WBOY
WBOY原創
2016-06-06 20:44:071080瀏覽

我原本的意思是如下代码

<code>                $eData=array(
                'section'=>$v['section'],
                'page'=>$v['page'],
                //'status'=>$v['status'],
                'type'=>$v['type'],
            );

                    unset($v['page']);
                    //unset($v['status']);
                    unset($v['id']);
                    unset($v['type']);
                    unset($v['section']);
            $eData['data']=serialize($v);
</code>

使用闭包的方式

<code>                $eData=array(
                'section'=>$v['section'],
                'page'=>$v['page'],
                //'status'=>$v['status'],
                'type'=>$v['type'],
                'data'=>function(){
                    unset($v['page']);
                    //unset($v['status']);
                    unset($v['id']);
                    unset($v['type']);
                    unset($v['section']);
            return serialize($v);
                    }
            );
</code>

问题 1、php的闭包类closure 并不支持返回参数
问题 2、使用了use方法后仍然不能够对$v进行格式化操作,只能够删除其中的元素
use 方法

<code class="lang-php">$eData=array( 'section'=>$v['section'],   
'page'=>$v['page'], 
//'status'=>$v['status'], 
'type'=>$v['type'], 
'data'=>function() use($v){ 
unset($v['page']);
 //unset($v['status']);
 unset($v['id']); 
unset($v['type']);
 unset($v['section']);                                          
return $v=serialize($v);
}, );
</code>

回复内容:

我原本的意思是如下代码

<code>                $eData=array(
                'section'=>$v['section'],
                'page'=>$v['page'],
                //'status'=>$v['status'],
                'type'=>$v['type'],
            );

                    unset($v['page']);
                    //unset($v['status']);
                    unset($v['id']);
                    unset($v['type']);
                    unset($v['section']);
            $eData['data']=serialize($v);
</code>

使用闭包的方式

<code>                $eData=array(
                'section'=>$v['section'],
                'page'=>$v['page'],
                //'status'=>$v['status'],
                'type'=>$v['type'],
                'data'=>function(){
                    unset($v['page']);
                    //unset($v['status']);
                    unset($v['id']);
                    unset($v['type']);
                    unset($v['section']);
            return serialize($v);
                    }
            );
</code>

问题 1、php的闭包类closure 并不支持返回参数
问题 2、使用了use方法后仍然不能够对$v进行格式化操作,只能够删除其中的元素
use 方法

<code class="lang-php">$eData=array( 'section'=>$v['section'],   
'page'=>$v['page'], 
//'status'=>$v['status'], 
'type'=>$v['type'], 
'data'=>function() use($v){ 
unset($v['page']);
 //unset($v['status']);
 unset($v['id']); 
unset($v['type']);
 unset($v['section']);                                          
return $v=serialize($v);
}, );
</code>

是要这个效果吗?

<code class="lang-php">$eData = array(
    'section' => $v['section'],
    'page'    => $v['page'],
    'type'    => $v['type'],
    'data'    => call_user_func(
        function() use (&$v)
        {
            unset($v['page']);
            unset($v['id']);
            unset($v['type']);
            unset($v['section']);
            return serialize($v);
        }
    ),
);
</code>

大致看了一下,你应该想让 'data'是serialize($v)吧?也就是将'section','page','type'去除后后序列化的字符串吧。'data'=>function() 是将匿名函数赋给了data.不是将返回值赋给data。
第二个问题太傻叉了

<code class="lang-php">'data'=>function() use($v){ 
unset($v['page']);
 //unset($v['status']);
 unset($v['id']); 
unset($v['type']);
 unset($v['section']);                                          
return $v=serialize($v)
</code>

使用use语法传递的是重新复制了一份传递,又不是引用,要想将$v变成序列化后的值就应该是引用use(&$v)

人家二楼说的是对的,凭什么不给人家采纳?

你那样是将一个匿名函数传给$eData['data']了,并没有把函数的返回结果给它。

不知道题主说的用闭包是怎样的情况。
就根据自己理解来回答下好了。

类似下面这样写:

<code>class A {

    var $eData = Array();

    function formatArrayWithHookFn( $hookFn ) {
        $hookFn( $this->$eData );
    }

}

$a = new A();
$a->formatArrayWithHookFn(function( $arrayToFormat ) {
    $arrayToFormat['foo'] = 'bar';
    // ...
});
</code>
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn