2010-05-21 122 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())声明中包含该声明。