将PHP匿名函数转换为非匿名函数

时间:2010-09-23 13:08:04

标签: php datetime timezone anonymous-function

我在丢失登录ID之前询问了相关问题 - PHP Version 5.2.14 / Parse error: syntax error, unexpected T_FUNCTION, expecting ')' - 但这是“整个”问题。

我很难弄清楚如何转换这个函数(从SO上的某个地方获得)到使用PHP 5.2.14(正如人们告诉我的那样 - 不支持匿名函数)。我尝试了一些更改代码以使其与array_map()一起使用的排列,但我无法理解一切是如何工作的!

整个函数粘贴在下面,但只有指出的区域是PHP 5.2.14抱怨的区域..

function convertGeneralAvailabilityTime($date,$from_timezone,$from_timebegin, $from_timeend, $to_timezone)
{

$tz1 = new DateTimezone($from_timezone);

$datetime1 = new DateTime("$date $from_timebegin", $tz1);
$datetime2 = new DateTime("$date $from_timeend", $tz1);

$convertedAvail = array(
    array($datetime1, $datetime2),
);


$tz2 = new DateTimezone($to_timezone);
//convert periods:

// ISSUE_START

$times = array_map(
    function (array $p) use ($tz2) {
       $res = array();
       foreach ($p as $d) {
           $res[] = $d->setTimezone($tz2);
       }
       return $res;
    },
    $convertedAvail
);

// ISSUE_END

$res = array();
foreach ($times as $t) {
    $t1 = reset($t);
    $t2 = next($t);
    if ($t1->format("d") == $t2->format("d")) {
        $res[$t1->format("l")][] = $t1->format("g:i a") . " to ".
            $t2->format("g:i a");
    }
    else {
        $res[$t1->format("l")][] = $t1->format("g:i a") . " to 11:59 pm";
        $res[$t2->format("l")][] = "12:00 am to ". $t2->format("g:i a");
    }
}

return $res;
}

4 个答案:

答案 0 :(得分:1)

如果你可以修改$converedAvail,那么你可以使用array_walk并传递用户定义的数据:

function convertTimezone(array &$p, $key, $tz2) {
    foreach ($p as &$d) {
        $d = $d->setTimezone($tz2);
    }
}

array_walk($convertedAvail, 'convertTimezone', $tz2);

我还没有测试过。但是如果你以前的代码在5.3上运行,那么这个代码应该适用于5.2。

答案 1 :(得分:0)

您可以使用名称定期在外部定义内容,而不是在array_map()调用中使用内联函数,并将其名称提供给array_map()。您可以在该函数内global $tz2访问该值。

function set_timezone_callback($p) {
    global $tz2;
    $res = array();
    foreach ($p as $d) {
        $res[] = $d->setTimezone($tz2);
    }
    return $res;
}

$times = array_map('set_timezone_callback', $convertedAvail);

根据您的代码重构建议,假设它有效,没有测试。

答案 2 :(得分:0)

array_map只是为$ convertedAvail的每个元素执行匿名函数。您可以使用foreach循环遍历元素并调用setTimezone()

,而不是array_map
foreach ($convertedAvail as $cKey => $dateArray)
{
    foreach ($dateArray as $dKey => $date)
    {
        $convertedAvail[$cKey][$dKey]->setTimezone($tz2);
    }
}

答案 3 :(得分:0)

好吧,正如提到的PHP< 5.3不支持匿名函数,因此你必须定义一些全局函数。

常见解决方案:

# PHP 5.3+

$array = array_map(function() {
    return /* do sth */;
}, $array);

# PHP < 5.3

function abcMyFunction() {
    return /* do sth */;
}

$array = array_map('abcMyFunction', $array);

将上述代码应用于您,现在应该很容易。

使用create_function()

PHP&lt; 5.3支持某种匿名函数 - 您可以使用create_function()定义它们。虽然它不会丢失你的全局命名空间,但它是如此难以理解且难以维护,我不建议使用该解决方案。