Bir dizi-php e-posta adreslerini filtreleme

5 Cevap php

Ben dizi (email_address1 => name1, email2 => isim2) biçimi olarak e-posta adreslerini içeren bir php dizi var.

Ben e-postalar geçerli olduğunu kontrol etmeniz gerekir ve ben olabilir foreach ve

foreach($arr as $email => $name) { 
   $new = array();
   if(filter_var($email, FILTER_VALIDATE_EMAIL)) {
   $new[$email] = $name;
  }
return $new;
}

Ben array_filter kullanılarak yukarıdaki elde edebilir miyim? ne sözdizimi olacaktır?

array_filter($emails_arr, 'filter_var') ?? how about FILTER_VALIDATE_EMAIL parameter?

teşekkürler.

5 Cevap

Eğer dizi olarak e-postalar kullanarak bu yana doğrudan birlikte keys, sen array_filter kullanamazsınız ve filter_var. Eğer keys yerine values dizisi çalışır olduğunu array_filter geçebilir bir callback işlevi yazmak gerekiyor; bu durumda sadece de foreach çözüm sopa ile yapabilirsiniz.

O me@the.foo ve mary@had.a.little.la.mb hem valid filter_var tarafından kabul edilir Not çünkü sadece olacak test sözdizimi ve semantik değil.

Mümkün kullanımı DNS / MX doğrulama eğer. Belki bunun için bir sınıf kullanmayı düşünün? İyi bir seçim olacağını http://framework.zend.com/manual/en/zend.validate.set.html#zend.validate.set.email_address

$emails = array(
    'me@the.re' => "user from beyond",
    'lalala' => "Lala user",
    'mary@had.a.little.la.mb' => "Mary with lamb"
);
$validator = new Zend_Validate_EmailAddress(
                 Zend_Validate_Hostname::ALLOW_DNS |
                 Zend_Validate_Hostname::ALLOW_LOCAL,
                 true); // enable DNS checking and lastly enable MX checking
foreach($emails as $email => $name){
    if ($validator->isValid($email)) {
        $validEmails[$email] => $name
    } else {
        foreach ($validator->getMessages() as $message) {
            echo "$message\n";
        }
    }
}

Bunu deneyin :)

Sadece (FILTER_VALIDATE_EMAIL, $ email) filter_var çağırır kendi fonksiyonu filter_email ($ email) oluşturabilirsiniz.

Geçerli değil ki, bu onay sadece e-posta adresi geçerli bir formata sahip olduğunu teyit unutmayın.

Ayrıca filter_var_array kullanabilirsiniz:

$result = array_intersect_key($arr, array_fill_keys(filter_var_array(array_keys($arr), FILTER_VALIDATE_EMAIL), ''));

array_keys: Lütfen tüm girdi anahtarları içeren bir dizi alır

filter_var_array: değerler bir dizi filtre

array_fill_keys: tuşları ilk giriş dizinin değer bir dizi oluşturur ve değerleri ikinci parametre vardır

array_intersect_key: diğer parametrelerden biri bir tuşa ilk parametre anahtar tekabül tüm değerleri döndürür

Bu Arkh cevabı gibi iç içe geçmiş fonksiyonların belirsiz kullanımı her türlü gerektirir. Ben sadece bir döngü kullanarak, idame amaçlı, daha iyi olduğunu düşünüyorum. foreach yineleyicileri içeren kod biraz daha fazla semantik anlam ekleyerek gerçekten harika bir yoldur.