Переход к следующей строке поискового массива во время цикла, но разрыв при изменении столбца

1

Я работаю над циклом через таблицу данных MySQL и создаю таблицу HTML (в php), которая будет отображать имена в этой таблице, в то время как определенный столбец или столбцы остаются неизменными. После изменения этих столбцов мне нужно выйти из внутреннего цикла и перебрать в следующую строку таблицы SQL, а затем снова запустить внутренний цикл, в то время как столбцы остаются неизменными.

 JobId  |        email        |  FName  |  LName  |  apply
   1    |   [email protected]  |   Joe   |  Smith  |   1
   1    |   [email protected]  |   Kim   | Joseph  |   1
   1    |   [email protected]  |  Chris  |   Bell  |   1
   2    |   [email protected]  |   Ben   |   Ken   |   0
   2    |   [email protected]  |   Sam   |  Socks  |   1
   3    |   [email protected]  |   Tom   |  Allen  |   0

Учитывая приведенную выше таблицу, я хочу отправить 1 электронное письмо по электронной почте по адресу электронной почты[email protected] с именем Джо, Кимом и Крисом. Затем повторите попытку и отправьте второе электронное письмо по адресу [email protected] с именем Бена и Сэма в сообщении, а затем третье электронное письмо по адресу электронной почты [email protected] с именем Тома в теле сообщения.

Я уже написал код, как отправлять электронные письма и т.д. У меня возникают проблемы с правильной итерацией запроса. Таким образом, я повторил результаты на веб-странице, чтобы помочь мне работать через нее, поэтому я не отправляю 1000 писем. Вот моя работа до сих пор:

while($row = mysqli_fetch_array($result)){
    echo 'Applicants: <br />';
        $JobId = $row['JobId'];
    echo $row['FName'] . ' ' . $row['LNname'] . '<br />';
    while (mysqli_fetch_array($result)['JobId'] == $JobId){
        echo $row['FName'] . ' ' . $row['LName'] . '<br />';
    }
    echo 'email address: ' . $row['email'] . '<br /><br />';
}

Это повторяется и дает мне правильный адрес электронной почты только один раз, и это здорово. Тем не менее, он дает мне то же имя FName и LName каждый раз, когда он итерации. Который я знаю, почему (массив $ row не переименован в следующую строку в запросе). Итак, это часть, которую я пропускаю, как это сделать.

Я также думаю, что количество раз, когда оно отображает имена, неверно... не так важно, но если вы сразу поймете, почему это тоже будет большой помощью.

Любая помощь будет оценена по достоинству. Благодарю!

Теги:
multidimensional-array
mysqli

3 ответа

1
Лучший ответ

Я думаю, что это должно сработать: вам просто нужно проверить, JobId ли текущий JobId от предыдущего, а также сохранить запись (здесь, во временной переменной $email) последнего адреса электронной почты. Предупреждение: я не проверял это!

$JobId = 0;
echo 'Applicants: <br />';
while($row = mysqli_fetch_array($result)){
    if ($row['JobId'] == $JobId) {
        // Nothing changed so save the email & carry on printing out names.
        $email = $row['email'];
        echo $row['FName'] . ' ' . $row['LNname'] . '<br />';
    } else {
        // We have a new JobId, so send the email, set the JobId marker,
        // and print the "Applicants" header again.
        echo 'Sending email to '.$email;
        $JobId = $row['JobId'];
        echo 'Applicants: <br />';
    }
}
  • 0
    Я думал о том, чтобы дать это решение с одним циклом, которое требует меньше памяти, но я решил предоставить опцию, которая, возможно, была бы более понятной для OP. Лично я бы использовал этот подход, поскольку он был бы лучше с точки зрения производительности и использования памяти. +1
  • 0
    @GluePear Я пометил ваш ответ как правильный, потому что он подобрал меня достаточно близко, и я смог выяснить, какие части не работали сразу после тестирования. Я включил ответ в ответ ниже. Спасибо за вашу помощь!
0

@GluePear дал мне отличную информацию, и я смог ее протестировать, а затем устранить остальные. Код GluePear дал мне в основном то, что я хотел, но по какой-то причине у него не было имени каждой группы. Поэтому я сделал некоторую работу и понял, что это связано с тем, что когда она попала в инструкцию else, массив уже находился в следующей строке, но мы не печатали имя. поэтому я просто добавил эхо с именем заявителя там, а также инициализацию If выражение и вуаля! Ниже приведен код.

$first = 1;
echo 'Applicants: <br />';

//start while loop to go through data
    while($row = mysqli_fetch_array($result)){

      if($first == 1){                
        $email = $row['email'];   //set the email address
        echo $row['FName'] . ' ' . $row['LName'] . '<br />';        //output the name
        $JobId = $row['JobIid'];     //set the JobId to the current row job id
        $first = 0;                 //change the first row so that we don't go through this initial if
} 
      else if ($row['JobId'] == $JobId) {
        $email = $row['email'];
        echo $row['FName'] . ' ' . $row['LName'] . '<br />';
} 
      else {
        //We have a new JobId, so send the email, set the JobId marker,
        // and print the applicants header again as well as the name of the next applicant from the current row
        echo 'Sending email to ' . $email . '<br /><br />';
        $JobId = $row['JobId'];
        echo 'Applicants: <br />';
        echo $row['FName'] . ' ' . $row['LName'] . '<br />';
  }
}
echo 'Sending email to ' . $email . '<br /><br />';

Это лучший способ, который я нашел для этого. Спасибо за помощь. Если кто-нибудь увидит что-то совершенно неправильное с этим, пожалуйста, дайте мне знать. :)

0

Вы вложены, в то время как циклы не имеют никакого смысла здесь, поскольку есть только один набор результатов, который вы просматриваете. Если использование памяти не является серьезной проблемой, я бы предложил создать многомерный массив для работы, чтобы упростить работу, причем электронное письмо является первым измерением. Что-то вроде этого:

// build array
$email_array = array();
while($row = mysqli_fetch_array($result)) {
    $email_array[$row['email']][] = $row;
}

// loop array
foreach($email_array as $email => $row) {
    // $email contains the target email address
    // $row contains array holding JobId, FName, Lname, apply
    // build your email here with some logic
    // send your email to $email
    // iterate loop to get to next email address
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню