Foreach函数将对多个数组多次执行

Sum*_*ius -2 php arrays email foreach

我正在处理邮件列表。

我的邮件列表现在有超过400封电子邮件,因此我正在使用foreach

我的问题是:我可以只限制100个电子邮件的foreach吗?

例如-向前100封电子邮件发送一封电子邮件,先中断,然后从停止的地方开始。因此,例如,对于400封电子邮件,foreach被调用4次以向所有电子邮件发送一封电子邮件。

foreach ($addresses as $to) {
     mail($to,$subject,$message,$headers);
}
Run Code Online (Sandbox Code Playgroud)

我需要这样做,因为如果我一次将电子邮件发送到所有400封电子邮件中,我将获得503服务不可用。

我试过了但是没用...

$emailchunkarray = array_chunk($addresses, 50);
$arraysize = count ($emailchunkarray);
$x = 0;

function chunker() {
    if ($x <= $arraysize) {
       foreach ($emailchunkarray[$x] as $to) {
           mail($to,$subject,$message,$headers);
       }
       $x++
       $chunker2();
    }
}
$chunker();

function chunker2() {
    if ($x <= $arraysize) {
        foreach ($emailchunkarray[$x] as $to){
            mail($to,$subject,$message,$headers);
        }
        $x++;
        $chunker();
    }
}
Run Code Online (Sandbox Code Playgroud)

由于某些原因,我无法回答我的问题...所以这是我的做法:

$ChunkAddresses = 10;
$EmailChunkArray = array_chunk($Addresses, $ChunkAddresses);
$ArraySize = count ($EmailChunkArray);
$ChunkSize = 0;
$ForeachCounter = 0;
ChunkLoop: {
    if ($GLOBALS["ChunkSize"] <= $GLOBALS["ArraySize"]) {
        $EmailChunkArrayLoop = $GLOBALS["EmailChunkArray"];
        foreach ($EmailChunkArrayLoop[$GLOBALS["ChunkSize"]] as $ToChunkLoop) {
            mail($ToChunkLoop,$GLOBALS["Subject"],$GLOBALS["Message"],$GLOBALS["Headers"]);
            $GLOBALS["ForeachCounter"]++;
                if ($GLOBALS["ForeachCounter"] == $GLOBALS["ChunkAddresses"]) {
                    echo "This is the " . $GLOBALS["ChunkSize"] . " chunk.";
                    $GLOBALS["ForeachCounter"] = 0;
                    break 1;}
        }
        $GLOBALS["ChunkSize"]++;
        sleep(3);
        goto ChunkLoopFollow;} else if ($GLOBALS["ChunkSize"] == $GLOBALS["ArraySize"]){
        exit();}
}
ChunkLoopFollow: {
    if ($GLOBALS["ChunkSize"] <= $GLOBALS["ArraySize"]) {
        $EmailChunkArrayLoopFollow = $GLOBALS["EmailChunkArray"];
        foreach ($EmailChunkArrayLoopFollow[$GLOBALS["ChunkSize"]] as $ToChunkLoopFollow) {
            mail($ToChunkLoopFollow,$GLOBALS["Subject"],$GLOBALS["Message"],$GLOBALS["Headers"]);
            $GLOBALS["ForeachCounter"]++;
                if ($GLOBALS["ForeachCounter"] == $GLOBALS["ChunkAddresses"]) {
                    echo "This is the " . $GLOBALS["ChunkSize"] . " chunk.";
                    $GLOBALS["ForeachCounter"] = 0;
                    break 1;}
        }
        $GLOBALS["ChunkSize"]++;
        sleep(3);
        goto ChunkLoop;} else if ($GLOBALS["ChunkSize"] == $GLOBALS["ArraySize"]){
        exit();}
}
echo "Finished!";
Run Code Online (Sandbox Code Playgroud)

Mel*_*cma 5

使用分割数组,array_chunk()然后用另一个foreach包装您的foreach。

array_chunk($input_array, 100);
Run Code Online (Sandbox Code Playgroud)

这应该给您一个由4个数组组成的数组,其中每个数组包含100个元素(电子邮件)。

这样可以回答您的问题,但可能对您没有帮助。您必须以某种方式暂停代码,为此,我建议使用AJAX,因为在JavaScript中,您可以轻松地指定定时事件。例如,您可以在PHP中创建小型API,以发送x电子邮件,从POST请求的y索引index xy值开始,然后通过对小型API的AJAX调用进行控制。

另一个解决方法是使用Cron jobs 如何使用PHP创建cron作业?

PHP array_chunk()

  • 尽管这会像OP所要求的那样拆分数组,但不会帮助他解决真正的问题。遍历新的分块数组仍将太快且出错。 (2认同)
  • 回声计数($ emailchunkarray); (2认同)