簡體   English   中英

如何簡化此冗余代碼?

[英]How can I simplify this redundant code?

有人可以幫助我簡化這段多余的代碼嗎?

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

我嘗試使用變量但沒有成功(自從我使用它們以來已經很長時間了)。

變量變量:

$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()將始終返回一個布爾值。 所以===真是多余的......

你可以做(​​未經測試)

$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];

把它放在一個功能?

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

我能做到這一點:

您可以為此創建一個函數:

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

現在您可以將變量傳遞給此函數。

只需將值粘貼在數組中並迭代它即可。

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

最終結果將是一個二維數組,第一個索引將是已設置的字段,第二個索引將是相應的電子郵件地址...

即使沒有完整的變量變量路由,只需將檢查放入一個公共函數,然后執行以下操作即可簡化這一過程:

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

對於初學者,你可以擺脫isset() === true ; isset()返回truefalse

當然把它放在一個函數中,因為所有的if語句看起來都做同樣的事情,但之前已經提到了......

順便說一句,如果輸入不是array() ,你的array_filter行是否有效?

如果沒有,則需要在if (is_string())語句中包含該語句。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM