多维关联数组电子邮件检查

I have an array multidimensional associative array.

Array
(


[0] => Array
        (
            [username] => uname1
            [name] => fullname1
            [email] => uname1@email.com

        )
[1] => Array
        (
            [username] => uname2
            [name] => fullname2
            [email] => uname2

        )
[2] => Array
        (
            [username] => uname3
            [name] => fullname3
            [email] => uname3@email

        )
[3] => Array
        (
            [username] => uname4
            [name] => fullname4
            [email] => uname4@

        )

}

It should validate email address using the regular expression.The return array should consists of an array with only valid array.The array should be

Array
(


[0] => Array
        (
            [username] => uname1
            [name] => fullname1
            [email] => uname1@email.com
}

since [1,2,3] have invalid email address.

Each of the answers is valid, and deserve some upvotes. FWIW, I tried running each over 10000 iterations, and measured the elapsed time using microtime(true).

  • @Gumbo's solution, array_filter()/filter_var(): 0.631 sec.

  • @Gordon's solution, array_filter()/filter_var() w/anon function: 0.620 sec.

  • @mck89's solution, array_filter()/preg_match(): 0.307 sec.

  • @Alexander.Plutov's solution, foreach()/preg_match(): 0.193 sec.

edit: I re-tested with a more robust email regex.

You can use

  • array_filter — Filters elements of an array using a callback function

with a custom callback that removes all invalid eMails, e.g. something like

$filtered = array_filter($input, function($item) {
    return filter_var($item['email'], FILTER_VALIDATE_EMAIL);
});

EDIT: the above uses PHP 5.2's native filter_var to validate the eMail. Using the shown anyonymous functions requires PHP5.3. See the chapter on callbacks for other types.

Use array_filter:

<?php
function filtermail($item)
{
    return preg_match($EmailValidationRegexp, $item["email"]);
}

$filtered=array_filter($array, "filtermail");
?>
foreach ($array as $key => $value) {
   if (preg_match("/^[^0-9][A-z0-9_]+([.][A-z0-9_]+)*[@][A-z0-9_]+([.][A-z0-9_]+)*[.][A-z]{2,4}$/", $value['email'])) {
      $correct = $array[$key]; 
   }
}

You can use array_filter to apply a function on each value of an array and filter those values out where the function returns a false value. And to validate the email address, you can use filter_var in combination with FILTER_VALIDATE_EMAIL:

function filter_email($item) {
    return isset($item['email']) && filter_var($item['email'], FILTER_VALIDATE_EMAIL);
}
$filtered = array_filter($arr, 'filter_email');