2012-03-06 16 views
0

私はパラメータをとる2つの関数を持っています。呼び出されたときの読み込み関数のみ - PHP

私のスクリプトの仕組みは、いくつかのデータを文字列として取得することです。この文字列は2つの形式にすることができ、私には知られておらず、あらかじめ取得することはできません。

私は2つの機能を持っています。それぞれのフォーマットの種類ごとに1つあります。

関数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

正確なエラーを貼り付けてください。ここに示したものに基づいて、関数2の中にない 'if(!$ eventstart){'では未定義のインデックスが発生していると思います。 – Julien

+1

また、 'preg_match'は値を返します。それが成功したと前に確認してください。 – hakre

+0

'$ eventtype'の文字列の例を挙げてください。少なくとも2つ、1つは最初の(日)、もう1つは2番目のタイプ(週単位)です。 – hakre

答えて

0

最も簡単な解決策は、関数の外部に必要な変数をグローバルにすることです。 を入力してください。

global $eventstart, $eventend... 

機能の冒頭に入力してください。

本当にデザインはひどいです。代わりに関数がハッシュまたはヌルを返すようにします。

0

条件をより慎重に定義してみてください.2つの関数が実行される唯一の方法は、$ eventstartが設定されている場合です。おそらく:

if ($eventstart == ""){} 

これで条件がトリガーされなくなります。 別のオプションは、最初の関数の最後で特定の条件に$ eventstartを設定し、2番目実行するには、その条件を探すことになる:あなたの関数を作成する必要があり、

(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と異なります。その部分を独自のメソッドとして抽出することができます(Refactoring - > Extract Method)。

これを実行して、実際に自分自身と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" 
} 

関連する問題