php中的匿名函数

时间:2013-04-13 15:11:34

标签: php anonymous-types

想象一下(即使它不是很好的风格)你有一个数组,你在其中添加数组和一些内容。
也许是这样的:

$result_array = array();

foreach( ... as $key => $value ) {
    $temp = array();
    $temp["start"] = $value->start;
    $temp["end"] = $value->end;
    $result_array[] = $temp;
}

// Image it will produce for example an $result_array like this:
   array(
       array("start" => 10, "end" => 20), 
       array("start" => 100, "end" => 120)
   );

到目前为止一切顺利。现在让我们做一些像这样的脏事: 我想在每个temp_array中添加一个匿名函数,该函数返回 start end 之间的范围。这看起来像这样:

foreach( ... as $key => $value ) {
    $temp = array();
    $temp["start"] = $value->start;
    $temp["end"] = $value->end;
    $temp["duration"] = function() { return abs( __START__ - __END__ ); }
    $result_array[] = $temp;
}

由于我在“数组”中并且我不知道我的索引,我如何访问我的开始和结束时间?

请不要因为不好的风格或语法错误而惹恼我,这只是我在问题栏中写下的一个例子。

提前致谢。

2 个答案:

答案 0 :(得分:1)

匿名函数与其"上下文数组没有任何关联"。您无法获取函数所在的数组值,因为函数和数组之间没有固有的连接。你能做的最好的事情是在创建时通过闭包给它值:

$temp['duration'] = function () use ($value) { return abs($value->start - $value->end); }

当然,这不会在循环中工作,因为$value的值会发生变化,所以你需要一个函数来生成函数来打破这个引用:

$temp['duration'] = call_user_func(function ($v) {
    return function () use ($v) { return abs($v->start - $v->end); };
}, $value);

我不确定你为什么要经历所有这些麻烦,而不是像往常一样计算和插入数组。

答案 1 :(得分:1)

我真的不知道是否由于某种原因(我不知道)这是一种不好的做法,但你可以使用这样的引用:

$temp["start"] = $value->start;
$start = &$temp["start"];
$temp["end"] = $value->end;
$end = &$temp["end"];
$temp["duration"] = function() use (&$start, &$end) { return abs( $start - $end ); };

顺便问一下,你是否有理由对这些值进行“懒惰”操作?