如何在php中使用数组在foreach循环中设置条件
我有两个数组,一个是电子邮件列表,另一个是smtp数组 我想在foreach循环和发送电子邮件中应用某些条件,但使用 下面的条件是我的代码 我已经用我粘贴在这里的代码尝试了它,但它并没有像预期的那样工作,因为我想对smtp应用限制,只发送smtp数组中指定的限制数组如何在php中使用数组在foreach循环中设置条件,php,arrays,foreach,Php,Arrays,Foreach,我有两个数组,一个是电子邮件列表,另一个是smtp数组 我想在foreach循环和发送电子邮件中应用某些条件,但使用 下面的条件是我的代码 我已经用我粘贴在这里的代码尝试了它,但它并没有像预期的那样工作,因为我想对smtp应用限制,只发送smtp数组中指定的限制数组 $emails=数组( "test1@gmail.com", "test2@gmail.com", "test3@gmail.com", "test4@gmail.com", "test5@gmail.com", "test6@gm
$emails=数组(
"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",
);
/*我已设置smtp阵列及其每日限制计数*/
$smtp=数组(
数组(“smtp1@gmail.com" => 2),
数组(“smtp2@gmail.com" => 4),
数组(“smtp3@gmail.com" => 5)
);
/*当我现在迭代$emails数组时*/
//预付款(smtp);
$counter=0;
foreach($email作为$email\u key=>$email\u值的电子邮件){
$smtp_detail=$smtp[$counter];
发送电子邮件($email\u值,$smtp\u详细信息);
$counter++;
}
到目前为止,它的工作良好,但它不与每SMTP电子邮件的限制工作
如何根据$stmp
中定义的smtp对电子邮件应用限制?它应该只发送11封电子邮件,因为这是总数(2+4+5=11),所以smtp1@gmail.com
应发送两封电子邮件,然后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
);
因此,总共应该只触发11封电子邮件,因为我的smtp限制计数是11,按照我指定的顺序通过
array\u shift()
从$smtp
数组中获取第一个元素-这将从数组中删除第一个元素并返回该元素。使用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
}
}
- 现场演示
$smtp
数组上循环,对于每次迭代,使用key()
获取电子邮件,使用array\u shift()
获取限制。与前面一样,这会删除数组的第一个元素,这意味着当您使用它足够多次时,将不会有任何其他内容需要循环
在外部循环中,循环您的$email
,并将值传递给函数。检查是否已达到限制,并使用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
}
}
}
- 现场演示
$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"
}
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"
}
要发送电子邮件,只需循环并发送:
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) "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"
}
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"
}
这可以按照上面的建议进行迭代和发送。只需提供预期输出。先生,我已经用预期输出更新了我的问题。在您的预期输出中,您有
smtp1@gmail.com
4次,但他最多只能回答2次,为什么?这基本上是你2小时前问的问题的重复,下次,请不要再重复了,如果您有东西要添加,请编辑原始问题。array_key_first()不能像我的php版本7.1那样工作,它在7.3中可用。。你能给我一个工作演示吗?因为我现在被卡住了badly@NarendraSharmaarray\u key\u first
手册提供了如何在早期PHP版本中实现该功能的建议。@NarendraSharma我已经更新了答案。第一种方式的逻辑有点缺陷。现在应该很好。它重复emai lds…查看您的演示..用户电子邮件应该是唯一的..一旦使用就不会再次出现您刚刚解决了问题,但您错过了订单。查看我的问题。第一封电子邮件应该由smtp1、smtp2和smtp3触发..为什么这很重要?这将仍然是巧合什么电子邮件将与什么smtp发送,因为它取决于电子邮件list@NarendraSharma看到我的新更新,它应该是你想要的@Andreas,就像你刚刚做的那样。。非常感谢。你终于让我过上了快乐的一天。@NarendraSharma如果答案对你有帮助,请接受它