2010-05-21 1 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

Хороший вопрос. Разумный, в отличие от большинства из них здесь. –

+0

Дубликат [Переменные функции и имена переменных в PHP] (http://stackoverflow.com/questions/1617976/variable-functions-and-variable-names-in-php). – outis

ответ

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

Regular (без использования переменных переменных):

$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, потому что компактна будет импортировать только переменные, которые установлены. Все остальные игнорируются ...

BTW: Вам не нужно true =. isset() или is_string() всегда возвращают логическое значение. Таким образом, === true является избыточным ...

+1

'compact()' ... Блестящий! Спасибо. :) –

+0

Я просто хотел бы добавить, что нужно делать 'compact ($ to, $ cc, $ bcc, $ from)', чтобы он пропускал нулевые переменные, в противном случае нам все еще нужна проверка 'isset()'. –

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. –

+1

@adam: Но условие 'else' не существует, если оно не является строковым процессом.Его интересует только строка, поэтому код выполняется только в том случае, если она не является строкой. – 2010-05-21 13:04:37

+1

Поскольку нет никакого другого условия, оно взрывается, если это строка, но фильтрует ее независимо от того, является ли она строкой или нет. Посмотрите еще раз. –

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

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() возвращает либо true, либо false.

И, конечно, поставить его в функцию, так как все ваши if заявления, кажется, делают то же самое, но that's упоминалось ранее ...

Кстати, делает вашу работу array_filter линии, если на входе не является array()?

Если нет, вам необходимо включить этот оператор в оператор if (is_string()).