昨天我问了一个关于USE标识符的问题,答案是PHP 5.3.0 USE keyword -- how to backport in 5.2?。
但是我不得不扩展我的脚本两次这样做,并且不确定我是如何容纳这两个
$available_event_objects = array_filter($event_objects, function ($event_object) use ($week_events) {
// keep if the event is not in $week_events
return !in_array($event_object, $week_events);
});`
和
$calendar_weeks[$week_count][$calendar_date] = array_filter($available_event_objects, function ($event_object) use ($date_pointer) {
// keep if the event is happening on this day
return ($date_pointer >= $event_object->start_date && $date_pointer <= $event_object->end_date);
});`
如何更改此设置以使其在5.2.9中运行?
有人能指出我正确的方向吗?
干杯
答案 0 :(得分:2)
PHP在5.3之前没有匿名函数。您必须使用callback types中的任何一个。因为这会变得更加困难,而且对于像你这样的用例来说不是很惯用,我建议你应用命令式编程风格。
$available_event_objects = array();
foreach ($event_objects as $event_object) {
if (in_array($event_object, $week_events)) {
$available_event_objects[] = $event_object;
}
}
那就是说,对于这种情况,你可以自由地使用array_intersect
,即。 $available_event_objects = array_intersect($week_events, $event_objects);
答案 1 :(得分:0)
更新回答:
虽然原始问题的答案是正确的,并且确实允许您在php 5.2中轻松使用array_filter,但没有闭包;简单地做一个for循环会更容易:
$output = array_filter($input, function($input) use ($stuff) { return /* condition */ } );
更改为:
$output = array();
foreach($input as $key=>$value) {
if (/* condition */) {
$output[$key] = $value;
}
}
答案 2 :(得分:0)
在“封闭”下的手册http://www.php.net/manual/en/functions.anonymous.php中粗略地涵盖了这一点。
use ($var)
所做的是在匿名函数和父作用域之间共享一个变量。通常它只保留初始值,并将该参数实际上转换为静态变量。
要将其转换为PHP 5.2兼容构造,最好将闭包转换为静态回调函数。而不是= function () {}
写一个普通的声明:
function cb_event_filter_week($event_object) {
一种非常不漂亮的方式是通过全局范围共享闭包/ use
变量。为此,重写函数
function cb_event_filter_week($event_object) {
global $week_events;
你必须在父函数中做同样的事情,也要初始化它!并且非常可取的是给该变量一个更加独特的名称。如果您只需要在应用程序流中的某一点(!)调用此回调函数,那么这里更好的替代方法是静态变量:
function cb_event_filter_week($event_object) {
static $week_events = 0;
真的取决于它的使用方式。但在任何一种情况下,您都可以编写= array_filter($event_objects, "cb_event_filter_week")
以便在PHP 5.2中使用它们