我有一个数组多维关联数组。
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@
)
}
它应该使用正则表达式验证电子邮件地址。返回数组应该包含一个只有有效数组的数组。数组应该是
Array
(
[0] => Array
(
[username] => uname1
[name] => fullname1
[email] => uname1@email.com
}
因为[1,2,3]的电子邮件地址无效。
答案 0 :(得分:5)
您可以使用array_filter
对数组的每个值应用函数,并在函数返回false值的位置过滤掉这些值。要验证电子邮件地址,您可以将filter_var
与FILTER_VALIDATE_EMAIL结合使用:
function filter_email($item) {
return isset($item['email']) && filter_var($item['email'], FILTER_VALIDATE_EMAIL);
}
$filtered = array_filter($arr, 'filter_email');
答案 1 :(得分:3)
每个答案都是有效的,值得一些赞成。 FWIW,我尝试运行10000次迭代,并使用microtime(true)
测量经过的时间。
@ Gumbo的解决方案,array_filter()/filter_var()
:0.631秒
@ Gordon的解决方案,array_filter()/filter_var()
w / anon功能:0.620秒。
@ mck89的解决方案,array_filter()/preg_match()
:0.307秒。
@ Alexander.Plutov的解决方案,foreach()/preg_match()
:0.193秒。
编辑:我使用a more robust email regex进行了重新测试。
答案 2 :(得分:2)
您可以使用
array_filter
- 使用回调函数过滤数组元素使用自定义回调删除所有无效的电子邮件,例如
之类的东西$filtered = array_filter($input, function($item) {
return filter_var($item['email'], FILTER_VALIDATE_EMAIL);
});
编辑:以上使用PHP 5.2的本机filter_var
来验证电子邮件。使用显示的anyonymous functions需要PHP5.3。 See the chapter on callbacks for other types
答案 3 :(得分:2)
使用array_filter:
<?php
function filtermail($item)
{
return preg_match($EmailValidationRegexp, $item["email"]);
}
$filtered=array_filter($array, "filtermail");
?>
答案 4 :(得分:2)
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];
}
}