想象一下(即使它不是很好的风格)你有一个数组,你在其中添加数组和一些内容。
也许是这样的:
$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;
}
由于我在“数组”中并且我不知道我的索引,我如何访问我的开始和结束时间?
请不要因为不好的风格或语法错误而惹恼我,这只是我在问题栏中写下的一个例子。
提前致谢。
答案 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 ); };
顺便问一下,你是否有理由对这些值进行“懒惰”操作?