如何在php中使用数组在foreach循环中设置条件

如何在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

我有两个数组,一个是电子邮件列表,另一个是smtp数组 我想在foreach循环和发送电子邮件中应用某些条件,但使用 下面的条件是我的代码

我已经用我粘贴在这里的代码尝试了它,但它并没有像预期的那样工作,因为我想对smtp应用限制,只发送smtp数组中指定的限制数组

$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
    }
}
  • 现场演示
或者,对于早期版本的PHP,也可以通过循环来实现。在
$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
        }
    }
}
  • 现场演示

我们可以使用foreach和array\u fill以及array\u 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"
}
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@NarendraSharma
array\u key\u first
手册提供了如何在早期PHP版本中实现该功能的建议。@NarendraSharma我已经更新了答案。第一种方式的逻辑有点缺陷。现在应该很好。它重复emai lds…查看您的演示..用户电子邮件应该是唯一的..一旦使用就不会再次出现您刚刚解决了问题,但您错过了订单。查看我的问题。第一封电子邮件应该由smtp1、smtp2和smtp3触发..为什么这很重要?这将仍然是巧合什么电子邮件将与什么smtp发送,因为它取决于电子邮件list@NarendraSharma看到我的新更新,它应该是你想要的@Andreas,就像你刚刚做的那样。。非常感谢。你终于让我过上了快乐的一天。@NarendraSharma如果答案对你有帮助,请接受它