closure - 求指导:php闭包实现数组的格式化
程序员文章站
2022-05-23 08:07:36
...
我原本的意思是如下代码
$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);
使用闭包的方式
$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);
}
);
问题 1、php的闭包类closure 并不支持返回参数
问题 2、使用了use方法后仍然不能够对$v进行格式化操作,只能够删除其中的元素
use 方法
$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);
}, );
回复内容:
我原本的意思是如下代码
$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);
使用闭包的方式
$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);
}
);
问题 1、php的闭包类closure 并不支持返回参数
问题 2、使用了use方法后仍然不能够对$v进行格式化操作,只能够删除其中的元素
use 方法
$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);
}, );
是要这个效果吗?
$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);
}
),
);
大致看了一下,你应该想让 'data'是serialize($v)吧?也就是将'section','page','type'去除后后序列化的字符串吧。'data'=>function() 是将匿名函数赋给了data.不是将返回值赋给data。
第二个问题太傻叉了
'data'=>function() use($v){
unset($v['page']);
//unset($v['status']);
unset($v['id']);
unset($v['type']);
unset($v['section']);
return $v=serialize($v)
使用use语法传递的是重新复制了一份传递,又不是引用,要想将$v变成序列化后的值就应该是引用use(&$v)
人家二楼说的是对的,凭什么不给人家采纳?
你那样是将一个匿名函数传给$eData['data']了,并没有把函数的返回结果给它。
不知道题主说的用闭包是怎样的情况。
就根据自己理解来回答下好了。
类似下面这样写:
class A {
var $eData = Array();
function formatArrayWithHookFn( $hookFn ) {
$hookFn( $this->$eData );
}
}
$a = new A();
$a->formatArrayWithHookFn(function( $arrayToFormat ) {
$arrayToFormat['foo'] = 'bar';
// ...
});
上一篇: DEDECMS 开发技巧总结_PHP教程