Как установить условие в цикле foreach с массивом в php - PullRequest
0 голосов
/ 11 июля 2019

У меня есть два массива, один из которых предназначен для списка адресов электронной почты, а другой - для массива 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.

Как мне применить лимит на электронную почту согласно smtp, как определено в $stmp?Он должен генерировать только 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
);

Таким образом, общее количество сообщений должно быть отправлено только 11, так как мой предел SMTP равен 11 в указанном мной порядке

Ответы [ 2 ]

2 голосов
/ 11 июля 2019

Получить первый элемент из вашего массива $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 голос
/ 11 июля 2019

Мы можем подготовить массив списка рассылки с помощью email => smtp, используя foreach, array_fill и array_combine.

Как только этот список составлен, массив можно итерировать и отправлять электронные письма с соответствующим 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...