2010-05-21 170 views
4

有人可以幫我簡化這段冗餘代碼嗎?如何簡化這個冗餘代碼?

if (isset($to) === true) 
{ 
    if (is_string($to) === true) 
    { 
     $to = explode(',', $to); 
    } 

    $to = array_filter(filter_var_array(preg_replace('~[<>]|%0[ab]|[[:cntrl:]]~i', '', $to), FILTER_VALIDATE_EMAIL)); 
} 

if (isset($cc) === true) 
{ 
    if (is_string($cc) === true) 
    { 
     $cc = explode(',', $cc); 
    } 

    $cc = array_filter(filter_var_array(preg_replace('~[<>]|%0[ab]|[[:cntrl:]]~i', '', $cc), FILTER_VALIDATE_EMAIL)); 
} 

if (isset($bcc) === true) 
{ 
    if (is_string($bcc) === true) 
    { 
     $bcc = explode(',', $bcc); 
    } 

    $bcc = array_filter(filter_var_array(preg_replace('~[<>]|%0[ab]|[[:cntrl:]]~i', '', $bcc), FILTER_VALIDATE_EMAIL)); 
} 

if (isset($from) === true) 
{ 
    if (is_string($from) === true) 
    { 
     $from = explode(',', $from); 
    } 

    $from = array_filter(filter_var_array(preg_replace('~[<>]|%0[ab]|[[:cntrl:]]~i', '', $from), FILTER_VALIDATE_EMAIL)); 
} 

我試過使用變量變量,但沒有成功(我用它們已經很長時間了)。

+1

好問題。明智的,不像這裏的大多數人。 – 2010-05-21 13:33:11

+0

[PHP中的變量函數和變量名稱]的副本(http://stackoverflow.com/questions/1617976/variable-functions-and-variable-names-in-php)。 – outis 2010-10-02 18:58:25

回答

4

可變變量:

$vars = array('to', 'cc', 'bcc', 'from'); 
foreach ($vars as $varname) { 
    if (isset($$varname)) { 
     if (is_string($$varname)) { 
      $$varname = explode(',', $$varname); 
     } 
     $$varname = array_filter(filter_var_array(preg_replace('~[<>]|%0[ab]|[[:cntrl:]]~i', '', $$varname), FILTER_VALIDATE_EMAIL)); 
    } 
} 

定期(不使用可變的變量):

$vars = compact('to', 'cc', 'bcc', 'from'); 
foreach ($vars as $name => &$var) { 
    if (is_string($var)) { 
     $var = explode(',', $var); 
    } 
    $var = array_filter(filter_var_array(preg_replace('~[<>]|%0[ab]|[[:cntrl:]]~i', '', $var), FILTER_VALIDATE_EMAIL)); 
} 
extract ($vars); 

注意,你不需要isset,因爲緊湊只會進口變量被設置。所有其他人都被忽略...

順便說一句:你不需要===真。 isset()或is_string()將始終返回一個布爾值。所以===真是多餘的...

+1

'compact()'......太棒了!謝謝。 :) – 2010-05-21 13:15:30

+0

我只想補充一點,它需要執行'compact($ to,$ cc,$ bcc,$ from)'來跳過空變量,否則我們仍然需要'isset()'檢查。 – 2010-05-23 13:28:38

1

我可以這樣做:

你或許可以爲創建一個函數:

function checkIt($var) 
{ 
    if (isset($var) === true) 
    { 
     if (is_string($var) === true) 
     { 
      $var = explode(',', $var); 
     } 

     $to = explode(',', $var); 
     $to = array_filter(filter_var_array(preg_replace('~[<>]|%0[ab]|[[:cntrl:]]~i', '', $to), FILTER_VALIDATE_EMAIL)); 
    } 

    return $to; 
} 

現在你可以通過你的變量此功能。

+0

但是,如果變量不是字符串,它將不會過濾,如同在OP中。 – 2010-05-21 13:02:42

+1

@adam:但是沒有'else'的條件,如果它不是一個字符串的話,否則就處理它。他只對字符串感興趣,所以只有在字符串不是其他情況下才會執行代碼。 – 2010-05-21 13:04:37

+1

因爲沒有其他條件,所以它會爆炸它,如果它是一個字符串,但不管它是否是一個字符串,都會對其進行過濾。再看一次。 – 2010-05-21 13:06:25

2

你可以這樣做(未經測試)

$vars = array($from, $to, $cc, $bcc); 

foreach ($vars as $var) 
     { 
     $var = explode(',', $var); 
     .... 
     ... 
     } 

$from = $vars[0]; 
$to = $vars[1]; 
$cc = $vars[2]; 
$bcc = $vars[3]; 
+0

我認爲你必須使'$ var'成爲一個引用,用'&' – Eric 2010-05-21 13:12:26

2

把它放在一個函數?

function validate($str) { 
    if (isset($str) === true) 
    { 
     if (is_string($str) === true) 
     { 
      $str = explode(',', $str); 
     } 

     $str = array_filter(filter_var_array(preg_replace('~[<>]|%0[ab]|[[:cntrl:]]~i', '', $str), FILTER_VALIDATE_EMAIL)); 
    } 
    return $str; 
} 

$to = validate($to); 
$cc = validate($cc); 
$bcc = validate($bcc); 
$from = validate($from); 
1

只需將值粘貼到數組中並遍歷它即可。

function cleanEmails($value) { 
    if (is_string($value)) { 
     $value = explode(',', $value); 
    } 
    return array_filter(filter_var_array(preg_replace('~[<>]|%0[ab]|[[:cntrl:]]~i', '', $value), FILTER_VALIDATE_EMAIL)); 
} 

$fields = array(); 
if (isset($to)) { 
    $fields['to'] = $to; 
} 
if (isset($from)) { 
    $fields['from'] = $from; 
} 
if (isset($cc)) { 
    $fields['cc'] = $cc; 
} 
if (isset($bcc)) { 
    $fields['bcc'] = $bcc; 
} 
$result = array_map('cleanEmails', $fields); 

最終的結果將是一個2維陣列,第一索引將已設置的字段,第二索引將是各個電子郵件地址...

1

即使沒有打算全部可變變量路線,你可以只通過將支票存入一個共同的功能,然後做簡化這個有很多:

$to = cleanup_email_addrs($to); 
$cc = cleanup_email_addrs($cc); 
$bcc = cleanup_email_addrs($bcc); 
$from = cleanup_email_addrs($from); 
1

因爲你可以擺脫isset() === true的起動器。 isset()返回truefalse

當然,把它放在一個函數作爲所有if語句似乎做同樣的事情,但that's被前面所提到的...

順便說一句,你的array_filter線工作,如果輸入是不是array()

如果不是,則需要在if (is_string())聲明中包含該聲明。