我有两个数组,一个是电子邮件列表,另一个是smtp数组 我想在foreach循环中应用某些条件并发送电子邮件,但是 下面的条件是我的代码。
我已经使用我粘贴到此处的代码进行了尝试,但是由于我想对smtp施加限制以仅发送smtp数组限制数组中指定的代码,因此它无法按预期工作。
$emails = array(
"test1@gmail.com",
"test2@gmail.com",
"test3@gmail.com",
"test4@gmail.com",
"test5@gmail.com",
"test6@gmail.com",
"test7@gmail.com",
"test8@gmail.com",
"test9@gmail.com",
"test10@gmail.com",
"tes11@gmail.com",
"test12@gmail.com",
"test13@gmail.com",
"test14@gmail.com",
"test15@gmail.com",
"test16@gmail.com",
"test17@gmail.com",
"test18@gmail.com",
"test19@gmail.com",
"test20@gmail.com",
);
/*I have set smtp array with Its Daily Limit Count*/
$smtp=array(
array("smtp1@gmail.com" => 2),
array("smtp2@gmail.com" => 4),
array("smtp3@gmail.com" => 5)
);
/*When I Iterate the $emails array now */
//pre($smtp);
$counter=0;
foreach($emails as $email_key=>$email_value){
$smtp_detail=$smtp[$counter];
send_email($email_value,$smtp_detail);
$counter++;
}
到目前为止,它可以正常工作,但不能使用每个SMTP电子邮件的限制。
如何按照$stmp
中定义的smtp对电子邮件施加限制?它应该只触发11封电子邮件,因为这是总数(2 + 4 + 5 = 11),所以smtp1@gmail.com
应该触发2封电子邮件,然后smtp2@gmail.com
应该触发4封电子邮件,而mtp3@gmail.com
应该开火5。
预期产量
$output_expected = array(
test1@gmail.com => 'ok', 'smtp_used' => smtp1@gmail.com,
test2@gmail.com => 'ok', 'smtp_used' => smtp2@gmail.com,
test3@gmail.com => 'ok', 'smtp_used' => smtp3@gmail.com,
test4@gmail.com => 'ok', 'smtp_used' => smtp1@gmail.com,
test5@gmail.com => 'ok', 'smtp_used' => smtp2@gmail.com,
test6@gmail.com => 'ok', 'smtp_used' => smtp3@gmail.com,
test7@gmail.com => 'ok', 'smtp_used' => smtp2@gmail.com,
test8@gmail.com => 'ok', 'smtp_used' => smtp3@gmail.com,
test9@gmail.com => 'ok', 'smtp_used' => smtp2@gmail.com,
test10@gmail.com => 'ok', 'smtp_used' => smtp3@gmail.com,
test11@gmail.com => 'ok', 'smtp_used' => smtp3@gmail.com
);
由于我的smtp限制计数按我指定的顺序为11,因此总电子邮件应仅触发11
答案 0 :(得分:2)
通过$smtp
从array_shift()
数组中获取第一个元素-这将从数组中删除第一个元素并返回它。使用reset()
获取值(即限制),使用key()
获取密钥(即SMTP电子邮件)。
在循环内,检查计数器是否已达到极限-如果已达到极限,移出下一个值对,查看是否返回了任何值对(如果其null
不再有值,则我们中断跳出循环)。如果得到有效结果,请再次使用reset()
和key()
。
$counter = 0;
$smtp_values = array_shift($smtp);
$limit = reset($smtp_values);
$smtp_email = key($smtp_values);
foreach ($emails as $email_key=>$email_value) {
send_email($email_value, $smtp_email);
$counter++;
if ($limit == $counter) { // Check if the limit was reached
$counter = 0; // Reset the counter
$smtp_values = array_shift($smtp); // Get the next pair of values
// If there are no more values in the $smtp array, break out of the loop
if (!$smtp_values) {
break;
}
$limit = reset($smtp_values); // Get the limit
$smtp_email = key($smtp_values); // Get the email
}
}
或者,对于早期版本的PHP,您也可以通过循环来实现。循环遍历$smtp
数组,对于每次迭代,使用key()
获取电子邮件,并使用array_shift()
获取限制。和以前一样,它删除了数组的第一个元素,这意味着当您使用它足够的时间时,将没有其他任何循环。
在外部循环内,循环$emails
并将值传递给函数。检查是否已达到限制,并使用continue 2
在外部循环上使用continue
。
$counter = 0;
foreach ($smtp as $s) {
$smtp_email = key($s);
$limit = array_shift($s);
foreach ($emails as $email_value) {
send_email($email_value, $smtp_email);
array_shift($emails);
$counter++;
if ($counter == $limit) {
$counter = 0;
continue 2; // Continue the outer loop
}
}
}
答案 1 :(得分:1)
我们可以使用foreach以及array_fill和array_combine用email => smtp准备发送列表数组。
完成此列表后,可以迭代该数组,并使用相应的smtp发送电子邮件。
$emails = array(
"test1@gmail.com",
"test2@gmail.com",
"test3@gmail.com",
"test4@gmail.com",
"test5@gmail.com",
"test6@gmail.com",
"test7@gmail.com",
"test8@gmail.com",
"test9@gmail.com",
"test10@gmail.com",
"tes11@gmail.com",
"test12@gmail.com",
"test13@gmail.com",
"test14@gmail.com",
"test15@gmail.com",
"test16@gmail.com",
"test17@gmail.com",
"test18@gmail.com",
"test19@gmail.com",
"test20@gmail.com",
);
/*I have set smtp array with Its Daily Limit Count*/
$smtps=array(
array("smtp1@gmail.com" => 2),
array("smtp2@gmail.com" => 4),
array("smtp3@gmail.com" => 5)
);
$start =0;
$send =[];
foreach($smtps as $sub){
foreach($sub as $smtp => $count){
$send = array_merge($send, array_combine(array_slice($emails, $start, $count),array_fill(0, $count, $smtp)));
$start += $count;
}
}
var_dump($send);
礼物:
array(11) {
["test1@gmail.com"]=>
string(15) "smtp1@gmail.com"
["test2@gmail.com"]=>
string(15) "smtp1@gmail.com"
["test3@gmail.com"]=>
string(15) "smtp2@gmail.com"
["test4@gmail.com"]=>
string(15) "smtp2@gmail.com"
["test5@gmail.com"]=>
string(15) "smtp2@gmail.com"
["test6@gmail.com"]=>
string(15) "smtp2@gmail.com"
["test7@gmail.com"]=>
string(15) "smtp3@gmail.com"
["test8@gmail.com"]=>
string(15) "smtp3@gmail.com"
["test9@gmail.com"]=>
string(15) "smtp3@gmail.com"
["test10@gmail.com"]=>
string(15) "smtp3@gmail.com"
["tes11@gmail.com"]=>
string(15) "smtp3@gmail.com"
}
要发送电子邮件,只需循环发送:
foreach($send as $mail => $smtp){
send_email($mail, $smtp);
}
如果顺序很重要,那么我们可以展平smtp数组以简化准备工作。
//Flatten smtp array
foreach($smtps as &$sub){
foreach($sub as $smtp => &$count){
$newsmtp[$smtp] = $count;
}
}
$start =0;
$send =[];
//Loop while there are $count left
while(array_sum($newsmtp)){
foreach($newsmtp as $smtp => &$count){
if($count){
$send = array_merge($send, array_combine(array_slice($emails, $start, 1), [$smtp]));
$count--;
$start++;
}
}
}
var_dump($send);
礼物:
array(11) {
["test1@gmail.com"]=>string(15) "smtp1@gmail.com"
["test2@gmail.com"]=>string(15) "smtp2@gmail.com"
["test3@gmail.com"]=>string(15) "smtp3@gmail.com"
["test4@gmail.com"]=>string(15) "smtp1@gmail.com"
["test5@gmail.com"]=>string(15) "smtp2@gmail.com"
["test6@gmail.com"]=>string(15) "smtp3@gmail.com"
["test7@gmail.com"]=>string(15) "smtp2@gmail.com"
["test8@gmail.com"]=>string(15) "smtp3@gmail.com"
["test9@gmail.com"]=>string(15) "smtp2@gmail.com"
["test10@gmail.com"]=string(15) "smtp3@gmail.com"
["tes11@gmail.com"]=>string(15) "smtp3@gmail.com"
}
可以按照上面的建议进行迭代和发送。
https://3v4l.org/b4fQf