如何简化此冗余代码?
-
04-10-2019 - |
题
有人可以帮助我简化这条冗余代码吗?
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()将始终返回布尔值。因此=== true是多余的...
其他提示
您可以做(未经测试)
$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);
即使不采用完整的变量途径,您也可以通过将支票放入共同的功能,然后执行以下操作来简化这一点:
$to = cleanup_email_addrs($to);
$cc = cleanup_email_addrs($cc);
$bcc = cleanup_email_addrs($bcc);
$from = cleanup_email_addrs($from);
只需将值粘贴在数组中,然后迭代它即可。
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维数组,第一个索引将是设置的字段,第二个索引将是相应的电子邮件地址...
我可以这样做:
您可能可以为此创建一个函数:
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;
}
现在,您可以将变量传递给此功能。
对于初学者,您可以摆脱 isset() === true
; isset()
返回 true
或者 false
.
当然将其作为您所有的功能 if
陈述似乎在做同样的事情,但之前提到了...
顺便说一句,你 array_filter
线路工作如果输入不是 array()
?
如果没有,您需要在 if (is_string())
陈述。
不隶属于 StackOverflow