[英]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()
返回true
或false
。
當然把它放在一個函數中,因為所有的if
語句看起來都做同樣的事情,但之前已經提到了......
順便說一句,如果輸入不是array()
,你的array_filter
行是否有效?
如果沒有,則需要在if (is_string())
語句中包含該語句。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.