Преобразование анонимной функции PHP в неанонимную - PullRequest
0 голосов
/ 23 сентября 2010

Я задал связанный вопрос, прежде чем потерял свой логин - PHP Версия 5.2.14 / Ошибка синтаксического анализа: синтаксическая ошибка, неожиданный T_FUNCTION, ожидание ')' - но это проблема "всего".

Мне трудно понять, как преобразовать эту функцию (полученную где-то на 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 ]

1 голос
/ 23 сентября 2010

Если у вас все в порядке с $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.

0 голосов
/ 23 сентября 2010

Ну, как уже упоминалось, PHP <5.3 не поддерживает анонимные функции, поэтому вы должны определить некоторую глобальную функцию. </p>

Общее решение:

# 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 <5.3 поддерживает некоторые виды анонимных функций - вы можете определить их, используя <a href="http://pl.php.net/manual/en/function.create-function.php" rel="nofollow noreferrer">create_function().Хотя оно не засоряет ваше глобальное пространство имен, оно настолько нечитабельно и сложно поддерживать, что я бы не советовал использовать это решение.

0 голосов
/ 23 сентября 2010

array_map просто выполняет анонимную функцию для каждого элемента $ convertAvail.Вместо array_map вы можете перебирать элементы с помощью foreach и вызывать setTimezone ()

foreach ($convertedAvail as $cKey => $dateArray)
{
    foreach ($dateArray as $dKey => $date)
    {
        $convertedAvail[$cKey][$dKey]->setTimezone($tz2);
    }
}
0 голосов
/ 23 сентября 2010

Вместо использования встроенной функции в вызове 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);

рекомендация по рефакторингу на основе вашего кода, если он работает, не проверял.

...