PHP для цикла работает только каждую вторую строку

#php #for-loop

#php #for-loop

Вопрос:

в моем текущем проекте я хочу разделить 10 пользователей из очереди на 2 команды по 5 пользователей в каждой.

Когда 10 пользователей находятся в очереди, выполняется функция create_new_lobby() . В этой функции создается матч, и все пользователи должны быть распределены по командам в промежуточной таблице. С помощью цикла for все пользователи должны быть назначены на совпадение. В настоящее время цикл for принимает только каждого второго пользователя (0, 2, 4, 6, 8). Значения 1, 3, 5, 7 и 9, по-видимому, пропускаются циклом for.

Где здесь ошибка?

 <?php 
function create_new_lobby() {

    global $connection;

    $timestamp = date("Y-m-d H:i:s", strtotime(date('h:i:sa')));

    $stmt = $connection->prepare("INSERT INTO competition_game (create_time) VALUES (?)");
    $stmt->bind_param("s", $timestamp);
    $stmt->execute();
    $stmt->close();

    $stmt = $connection->prepare("SELECT competition_match_id FROM competition_game ORDER BY competition_match_id DESC LIMIT 0, 1");
    $stmt->execute();
    $result = $stmt->get_result();
    $row = $result->fetch_assoc();

    $competition_match_id = $row['competition_match_id'];

    $stmt->close();

    for($player = 0; $player <= 9; $player  ) {
        $status_queue = 1;
        $stmt = $connection->prepare("SELECT * FROM competition_queue WHERE competition_queue_status = ? AND DATE_ADD(competition_queue_activity ,INTERVAL 20 MINUTE) >= NOW() ORDER BY competition_queue_id ASC LIMIT ?, 1");
        $stmt->bind_param("ss", $status_queue, $player);
        $stmt->execute();
        $result = $stmt->get_result();

        while($row = $result->fetch_assoc()) {

            $user_id = $row['user_id'];

            $stmt1 = $connection->prepare("INSERT INTO competition_game_player (competition_match_id, user_id) VALUES (?, ?)");
            $stmt1->bind_param("ss", $competition_match_id, $user_id);
            $stmt1->execute();
            $stmt1->close();
        }

        $stmt->close();

        $status_leave = 2;
        $stmt = $connection->prepare("UPDATE competition_queue SET competition_queue_status = ? WHERE user_id = ? AND competition_queue_status = ?");
        $stmt->bind_param("sss", $status_leave, $user_id, $status_queue);
        $stmt->execute();
        $stmt->close();
    }
}
?>
 

Текущий результат:
Текущий вывод базы данных

Ожидаемый результат:
Ожидаемый результат

Комментарии:

1. Проблема в том, что вы SELECT * FROM competition_queue используете LIMIT для извлечения определенной записи внутри цикла, обрабатываете эту запись, а затем в конце того же цикла вы UPDATE competition_queue — что эффективно удаляет запись из очереди. Таким образом, теперь у вас на 1 запись меньше в очереди, но вы все равно увеличиваете $player

Ответ №1:

Цикл for работает так, как должен, и вы можете проверить это, поместив var_dump($payer) внутри цикла for;

Приращение в цикле for задается третьим оператором, the $player , что означает $player = $player 1;

Если вы хотите использовать другой шаг цикла, вы можете добавить другое выражение для третьего оператора в цикле for.

например ,

 for($player = 0; $player <= 9; $player  ) {
    var_dump($player);
}
exit;
 

Фрагмент кода будет выводить 0 1 2 3 4 5 6 7 8 9

 for($player = 0; $player <= 9; $player  = 2) {
    var_dump($player);
}
exit;
 

Фрагмент кода выведет 0 2 4 6 8

Я надеюсь, что это помогло вам лучше понять цикл for.

Фактическая проблема, с которой вы сталкиваетесь, создается логикой, которую вы создали с помощью SQL, а не циклом for