代码之家  ›  专栏  ›  技术社区  ›  Alix Axel

如何简化这个冗余代码?

  •  4
  • Alix Axel  · 技术社区  · 14 年前

    有人能帮我简化这段多余的代码吗?

    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));
    }
    

    我尝试使用变量,但没有成功(我用了很久)。

    7 回复  |  直到 9 年前
        1
  •  4
  •   ircmaxell    14 年前

    变量:

    $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,因为compact只导入已设置的变量。其他的都被忽略了…

    顺便说一句:你不需要==true。isset()或is_string()将始终返回布尔值。所以==true是多余的…

        2
  •  2
  •   nico    14 年前

    你可以做(未经测试)

    $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];
    
        3
  •  2
  •   Adam Hopkinson    14 年前

    把它放在函数里?

    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);
    
        4
  •  1
  •   David Gelhar    14 年前

    即使不使用完整的变量路径,也可以通过将检查放入一个公共函数中,然后执行以下操作来简化这一过程:

    $to = cleanup_email_addrs($to);
    $cc = cleanup_email_addrs($cc);
    $bcc = cleanup_email_addrs($bcc);
    $from = cleanup_email_addrs($from);
    
        5
  •  1
  •   wimvds    14 年前

    只需将值粘贴到数组中并对其进行迭代。

    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);
    

    最终结果将是一个二维数组,第一个索引将是设置的字段,第二个索引将是各自的电子邮件地址…

        6
  •  1
  •   Web Logic    14 年前

    我可以这样做:

    您可以为此创建一个函数:

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

    现在你可以把变量传递给这个函数。

        7
  •  1
  •   jeroen    14 年前

    首先,你可以摆脱 isset() === true ; isset() 也返回 true false .

    当然,把它作为 if 陈述似乎也有同样的作用,但之前提到过的那些话……

    顺便问一下,你的 array_filter 如果输入不是 array() ?

    如果没有,则需要将该语句包含在 if (is_string())