Quelqu'un peut-il m'aider s'il vous plaît à simplifier ce morceau de code redondant? J'ai essayé d'utiliser des variables variables mais sans succès (cela fait longtemps que je ne les utilise plus).Comment simplifier ce code redondant?
Répondre
variables dynamiques:
$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));
}
}
régulier (sans l'aide de variables variables):
$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);
Note, vous n'avez pas isset, car compact seules variables à l'importation qui sont définies. Tous les autres sont ignorés ...
BTW: Vous n'avez pas besoin du === vrai. isset() ou is_string() retournera toujours un booléen. Donc le === vrai est redondant ...
'compact()' ... Brillant! Je vous remercie. :) –
Je voudrais simplement ajouter qu'il est nécessaire de faire 'compact ($ à, $ cc, $ bcc, $ from)' pour qu'il ignore les variables nulles, sinon nous avons encore besoin de la vérification 'isset()'. –
que je pouvais faire ceci:
Vous pouvez probablement créer une fonction pour cela:
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;
}
Et maintenant, vous pouvez passer vos variables à cette fonction.
Mais alors il ne filtrera pas si la variable n'est pas une chaîne, comme dans l'OP. –
@adam: Mais il n'y a pas de condition 'else' que si ce n'est pas une chaîne de traitement, sinon.Il s'intéresse uniquement à la chaîne de caractères, donc le code ne s'exécute que s'il s'agit d'une chaîne, sinon. –
Parce qu'il n'y a pas d'autre condition, il l'explose s'il s'agit d'une chaîne mais la filtre, qu'il s'agisse d'une chaîne ou non. Avoir un autre regard. –
Vous pouvez faire (non testé)
$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];
Je pense que vous devez faire de' $ var' une référence, avec un '&' – Eric
Mettez dans une fonction?
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);
Placez simplement les valeurs dans un tableau et parcourez-les.
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);
Le résultat final sera un tableau à 2 dimensions, premier indice sera les champs qui ont été fixés, deuxième indice sera les adresses e-mail respectives ...
Même sans aller l'itinéraire complet des variables variables , vous pouvez simplifier beaucoup juste en mettant les chèques dans une fonction commune, et de faire ensuite:
$to = cleanup_email_addrs($to);
$cc = cleanup_email_addrs($cc);
$bcc = cleanup_email_addrs($bcc);
$from = cleanup_email_addrs($from);
Pour commencer, vous pouvez vous débarrasser de la isset() === true
; isset()
renvoie true
ou false
.
Et bien sûr, le mettre dans une fonction que tous vos if
déclarations semblent faire la même chose, mais thats été mentionné avant ...
Par ailleurs, votre travail en ligne array_filter
si l'entrée ce n'est pas un array()
?
Si ce n'est pas le cas, vous devez inclure cette instruction dans l'instruction if (is_string())
.
Bonne question. Sensible, contrairement à la plupart d'entre eux ici. –
Duplication de [Fonctions variables et noms de variables en PHP] (http://stackoverflow.com/questions/1617976/variable-functions-and-variable-names-in-php). – outis