2012-03-06 63 views
0

我有兩個函數,它們需要一個參數。只有在調用時才能讀取函數 - PHP

我的腳本的工作方式是它將一些數據作爲字符串檢索。這個字符串可以是兩種格式,這對我來說是未知的,並且不能事先獲得。

所以我有2個功能,每種類型的格式。

首先調用函數1,並將字符串作爲參數傳遞。然後我檢查一下這個函數中的變量是否已經被賦值。如果變量已被賦值,則表示字符串格式已被識別。如果變量尚未分配,則使用相同的參數調用函數2。這應該工作。

問題是,當我運行腳本,說如果function1工作,然後我得到未定義的函數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

請貼上您的確切錯誤。根據這裏顯示的內容,我會認爲未定義的索引出現在'if(!$ eventstart){',它不在函數2中。' – Julien 2012-03-06 15:43:14

+1

另外,'preg_match'返回一個值。檢查它,然後假定它是成功的。 – hakre 2012-03-06 15:53:34

+0

請給出'$ eventtype'的示例字符串。至少有兩個,一個匹配第一個(日),一個匹配第二個類型(每週)。 – hakre 2012-03-06 15:56:26

回答

0

最快的解決方案是在全局函數之外創建所需的變量。 把

global $eventstart, $eventend... 

在功能的開始。

但確實,設計是可怕的。使函數返回一個散列或null。

0

嘗試更仔細地定義條件 - 函數2運行的唯一方法是設置$ eventstart。也許:

if ($eventstart == ""){} 

這應該停止條件觸發。 另一種辦法是設置$ eventstart在第一功能的末端的特定條件,然後尋找一個條件運行第二:

(within first function) if ($recinfod[1] ==""){$eventstart = FALSE}; 

最好成績,

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" 
} 

我希望這是有幫助的。

相關問題