我编写了一个脚本(我对 PHP 还很陌生),它将采用元素列表作为输入,并检查它是否只是用户名或包含用户名+域名(我的意思是电子邮件)。
如果它只是一个用户名,那么它会将“@test.com”附加到该用户名中,并将所有字符串组合在一起以发送电子邮件通知。
$recipients = array("kumar", "[email protected]", "ravi", "[email protected]");
$with_domain = array();
$without_domain = array();
$exp = "/^\S+@\S+\.\S+$/";
foreach ($recipients as $user) {
if(preg_match($exp, $user)) {
array_push($with_domain, $user);
} else {
array_push($without_domain, $user);
}
}
$without_domain_new = implode("@test.com", $without_domain)."@test.com";
print_r($with_domain);
print_r($without_domain_new);
echo "<br>";
$r = implode("", $with_domain);
$s = $without_domain_new.$r;
print "Email notification need to be sent to: $s";
这里脚本按预期工作。但
$r = implode("", $with_domain); $s = $without_domain_new.$r;
这行真的有必要吗?
PHP 中可以合并数组和字符串吗?我的意思是,是否可以合并
$with_domain
和 $without_domain_new
并将其作为字符串存储到 $s
?
您不必创建多个数组来存储中间结果并进行多次内爆来获得最终结果。您可以使用字符串映射数组,以便它们都具有正确的格式,然后仅内爆一次。
当使用带有空字符串(默认)的 implode 时,您的结果将所有字符串连接在一起而没有分隔符,并且您无法区分电子邮件地址。
如果您的电子邮件地址只能包含单个
@
字符,您可以使用 否定字符类更新模式以排除匹配的 @
字符
$recipients = ["kumar","[email protected]","ravi","[email protected]"];
$pattern = "/^[^\s@]+@[^\s@]+\.[^\s@]+$/";
$s = implode(
", ",
array_map(fn($user) => preg_match($pattern, $user) ? $user : $user . "@test.com", $recipients)
);
echo $s;
输出
[email protected], [email protected], [email protected], [email protected]
查看 PHP 演示。
用途:
$emails = array_map(function ($username) {
return preg_match("/^\S+@\S+\.\S+$/", $username) ? $username : $username . '@test.com';
}, $recipients);
它将为您提供一个包含您想要的所有电子邮件地址的数组。
然后您可以使用
implode('', $emails)
或者 implode(',', $emails)
将数组转换为字符串以发送通知。
首先,我建议您从一开始就尝试稍微简化代码。示例:
array()
不是必需的。而只是使用 []
。我也更喜欢单引号,但这只是我:) 所以你的数组:
$recipients = array("kumar", "[email protected]", "ravi", "[email protected]");
变成:
$recipients = ['kumar', '[email protected]', 'ravi', '[email protected]'];
此外,当需要将多个数组项推向数组时,通常会使用
array_push
,因此这里一个简单的$array[] = 'something';
就足够了。
现在讨论手头的实际问题。
您可以通过以下方式简化您想要实现的目标:
$recipients = ['kumar', '[email protected]', 'ravi', '[email protected]'];
$users = [];
foreach ($recipients as $user) {
if (preg_match("/^\S+@\S+\.\S+$/", $user)) {
$users[] = $user;
} else {
$users[] = $user . '@test.com';
}
}
print 'Email notification need to be sent to: ' . implode(', ', $users);
这样,您就可以将所有用户添加到
$users
数组中,并将 @test.com
附加到需要附加的用户。处理 one 数组,因为您对 one 结果感兴趣,即需要向用户发送电子邮件:)
对我来说最简单的是,您只需使用
preg_replace()
将电子邮件域添加到任何不包含该域的字符串,然后用逗号和空格连接结果。
代码:(演示)
$recipients = [
"kumar",
"[email protected]",
"ravi",
"[email protected]"
];
echo implode(
', ',
preg_replace(
'/^[^@]+$/',
'[email protected]',
$recipients
)
);
结果:
[email protected], [email protected], [email protected], [email protected]
如果要将数组和字符串合并为一个字符串,可以使用 implode() 函数将数组转换为字符串,然后将它们连接在一起。这是代码的更新版本:
<?php
$recipients = array("kumar", "[email protected]", "ravi", "[email protected]");
$with_domain = array();
$without_domain = array();
$exp = "/^\S+@\S+\.\S+$/";
foreach ($recipients as $user) {
if (preg_match($exp, $user)) {
array_push($with_domain, $user);
} else {
array_push($without_domain, $user);
}
}
$without_domain_new = implode("@test.com ", $without_domain) . "@test.com";
$combined = implode(", ", array_merge($with_domain, [$without_domain_new]));
print "Email notification needs to be sent to: $combined";
?>
在此更新的代码中,$without_domain_new 是通过使用 implode() 将 $without_domain 数组的元素与字符串“@test.com”(注意 .com 后面的空格)作为分隔符连接起来创建的。然后,使用 array_merge() 将 $with_domain 数组和 $without_domain_new 合并,将它们组合成一个数组。最后,合并的数组使用“,”(逗号后跟空格)作为分隔符进行内爆,以创建所需的字符串,该字符串存储在 $combined 中。
现在,当您打印 $combined 时,它将显示包含所有带域和不带域的电子邮件地址的合并字符串,以逗号和空格分隔。