如何使用PHP

时间:2019-07-11 06:30:52

标签: php arrays foreach

我有两个数组,一个是电子邮件列表,另一个是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

2 个答案:

答案 0 :(得分:2)

通过$smtparray_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