首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将PHP匿名函数转换为非匿名函数

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

Stack Overflow用户
提问于 2010-09-23 21:08:04
回答 4查看 574关注 0票数 0

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

我很难弄清楚如何将这个函数(从某个地方获得)转换为PHP 5.2.14 (正如人们告诉我的那样,它不支持匿名函数)。我尝试了几种改变代码以使其与array_map()一起工作的方法,但是我不能理解所有东西是如何工作的!

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

代码语言:javascript
复制
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;
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-09-23 21:14:24

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

代码语言:javascript
复制
function convertTimezone(array &$p, $key, $tz2) {
    foreach ($p as &$d) {
        $d = $d->setTimezone($tz2);
    }
}

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

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

票数 1
EN

Stack Overflow用户

发布于 2010-09-23 21:12:11

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

代码语言:javascript
复制
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);

基于你的代码重构建议,假设它工作,没有测试。

票数 0
EN

Stack Overflow用户

发布于 2010-09-23 21:17:04

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

代码语言:javascript
复制
foreach ($convertedAvail as $cKey => $dateArray)
{
    foreach ($dateArray as $dKey => $date)
    {
        $convertedAvail[$cKey][$dKey]->setTimezone($tz2);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3778659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档