我有两个函数,它们带一个参数。
我的脚本的工作方式是它以字符串形式检索一些数据。这个字符串可以是两种格式,这对我来说是未知的,不能事先获得。
所以我有2个函数,每种格式一个。
首先调用函数1,将字符串作为参数传递。然后,我检查是否已分配此函数中的变量。如果已分配变量,则表示已识别字符串格式。如果尚未分配变量,则使用相同的参数调用函数2。这应该有用。
问题在于,当我运行脚本时,假设函数1工作,那么我得到函数2的未定义变量错误。我不明白为什么会这样,因为它尚未被调用,因此不应该已被处理/查看。
有没有办法在调用函数时才能使函数可用?
recurrence_info_day($eventtype);
$recurrence_type = "daily";
if (!$eventstart){
recurrence_info_weekly($eventtype);
$recurrence_type = "weekly";
}
function recurrence_info_day($eventtype){
$s = $eventtype;
preg_match('/^DTSTART;VALUE=DATE:(\d+)\s+DTEND;VALUE=DATE:(\d+)\s+RRULE:FREQ=(\w+);INTERVAL=(\d+);UNTIL=(\d+)/', $s, $recinfod);
$eventstart = $recinfod[1];
$eventend = $recinfod[2];
$eventfrequency = $recinfod[3];
$eventinterval = $recinfod[4];
$eventuntil = $recinfod[5];
$formstartdate = substr($eventstart,4,2)."/".substr($eventstart, 6)."/".substr($eventstart,0,4);
$formenddate = substr($eventuntil,4,2)."/".substr($eventuntil, 6)."/".substr($eventuntil,0,4);
}
function recurrence_info_weekly($eventtype){
$s = $eventtype;
preg_match('/^DTSTART;VALUE=DATE:(\d+)\s+DTEND;VALUE=DATE:(\d+)\sRRULE:FREQ=(\w+);BYDAY=(\d+);UNTIL=(\d+)/', $s, $recinfow);
$eventstart = $recinfow[1];
$eventend = $recinfow[2];
$eventfrequency = $recinfow[3];
$eventdays = $recinfow[4];
$eventuntil = $recinfow[5];
$formstartdate = substr($eventstart,4,2)."/".substr($eventstart, 6)."/".substr($eventstart,0,4);
$formenddate = substr($eventuntil,4,2)."/".substr($eventuntil, 6)."/".substr($eventuntil,0,4);
}
答案 0 :(得分:1)
你需要让你的函数返回某些东西,以便你知道它们是否匹配任何东西:
function myFunction() {
return 'A';
}
$a = myFunction();
echo $a; # value;
您的函数返回多个值。所以你可以让它返回多个值,这可以用数组来完成:
function myFunction2() {
return array('A', 'B');
}
list($a, $b) = myFunction2();
echo $a, ' ', $b; # A B;
除了这些基础知识之外,你还在这两个函数中有很多代码重复。它们与preg_match
运行的模式基本不同。因此,您可以将该部分提取为自己的方法(重构 - >提取方法)。
这样做并实际检查来自您自己和PHP自己的函数的返回值可能会导致这种情况。这并不完美,但显示了对原始代码的一些改进,并允许您实际测试是否触发了某些事件类型。例如:
$eventtype = 'DTSTART;VALUE=DATE:123456789 DTEND;VALUE=DATE:123456789 RRULE:FREQ=2;INTERVAL=2222;UNTIL=123456789';
$result = recurrence_info_day($eventtype);
if ($result) {
$recurrence_type = "daily";
list($event, $form) = $result;
} else {
$result = recurrence_info_weekly($eventtype);
if ($result) {
$recurrence_type = "weekly";
list($event, $form) = $result;
}
}
var_dump($eventtype, $recurrence_type, $event, $form);
function recurrence_info_day($eventtype){
$pattern = '/^DTSTART;VALUE=DATE:(\d+)\s+DTEND;VALUE=DATE:(\d+)\s+RRULE:FREQ=(\w+);INTERVAL=(\d+);UNTIL=(\d+)/';
return reccurence_info_pattern($eventtype, $pattern);
}
function recurrence_info_weekly($eventtype){
$pattern = '/^DTSTART;VALUE=DATE:(\d+)\s+DTEND;VALUE=DATE:(\d+)\sRRULE:FREQ=(\w+);BYDAY=(\d+);UNTIL=(\d+)/';
return reccurence_info_pattern($eventtype, $pattern);
}
function reccurence_info_pattern($eventtype, $pattern)
{
$r = preg_match(
$pattern,
$eventtype,
$recinfow
);
if (!$r) {
return NULL;
}
$event = new stdClass();
$event->start = $recinfow[1];
$event->end = $recinfow[2];
$event->frequency = $recinfow[3];
$event->days = $recinfow[4];
$event->until = $recinfow[5];
$form = new stdClass();
$form->startdate = substr($event->start, 4, 2) . "/" . substr($event->start, 6) . "/" . substr($event->start, 0, 4);
$form->enddate = substr($event->until, 4, 2) . "/" . substr($event->until, 6) . "/" . substr($event->until, 0, 4);
return array($event, $form);
}
输出:
string(98) "DTSTART;VALUE=DATE:123456789 DTEND;VALUE=DATE:123456789 RRULE:FREQ=2;INTERVAL=2222;UNTIL=123456789"
string(5) "daily"
object(stdClass)#1 (5) {
["start"]=>
string(9) "123456789"
["end"]=>
string(9) "123456789"
["frequency"]=>
string(1) "2"
["days"]=>
string(4) "2222"
["until"]=>
string(9) "123456789"
}
object(stdClass)#2 (2) {
["startdate"]=>
string(11) "56/789/1234"
["enddate"]=>
string(11) "56/789/1234"
}
我希望这有用。
答案 1 :(得分:0)
最快的解决方案是在函数全局之外创建所需的变量。 放
global $eventstart, $eventend...
在函数的开头。
但实际上,设计很糟糕。使函数返回一个hash或null。
答案 2 :(得分:0)
尝试更仔细地定义条件 - 函数2运行的唯一方法是设置$ eventstart。也许:
if ($eventstart == ""){}
这应该可以阻止条件被触发。 另一个选项是将$ eventstart设置为第一个函数末尾的特定条件,然后查找该条件以运行第二个函数:
(within first function) if ($recinfod[1] ==""){$eventstart = FALSE};
贝斯茨,