2011-05-04 64 views
0

昨天我問了一個關於USE標識符的問題,它的回答是PHP 5.3.0 USE keyword -- how to backport in 5.2?PHP 5.3.0 USE identifier

但是我不得不延長我的腳本來做到這兩次,我不確定如何適應這兩種

$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工作0.9?

有人可以指出我在正確的方向?

乾杯

+0

閱讀你鏈接的問題似乎你想讓這些3.0腳本與2.9兼容。目前這個問題還不清楚,所以你可能想澄清一下。 – jisaacstone 2011-05-04 15:21:37

回答

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

+0

爲我工作,感謝您的幫助 – Brob 2011-05-04 17:49:30

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; 

    } 

} 
+0

嗨,感謝您的回覆。問題是我需要這個工作在5.2.9和USE標識符只在5.3.0可用 – Brob 2011-05-04 15:21:20

+0

嘿,我編輯我的回答 – Evert 2011-05-04 15:23:10

0

它execeptionally大略在手冊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; 

實際上取決於它是如何使用的。但是,無論哪種情況,您都可以在0123中使用= array_filter($event_objects, "cb_event_filter_week")來使用它們。