0

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

$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 中startend之间的跨度。这可能看起来像这样:

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

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

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

提前致谢。

4

2 回答 2

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);

我不知道为什么你会经历所有这些麻烦,而不是像往常一样计算并将值插入到数组中。

于 2013-04-13T15:18:00.657 回答
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 ); };

顺便说一句,您是否有理由要对这些值进行“惰性”操作?

于 2013-04-13T15:24:01.790 回答