我在丢失登录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;
}
答案 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_mapforeach ($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()
定义它们。虽然它不会丢失你的全局命名空间,但它是如此难以理解且难以维护,我不建议使用该解决方案。