蓝极冰焰 2024-07-12 15:41 采纳率: 40.7%
浏览 9
已结题

PHP中关于排名和显示的问题

这个代码不知道哪里有问题,显示的时候,少了1个人,如图:

img


我想要的是,显示还是按照第一列顺序order来依次显示,但是需要有一个排名的赋值(这个是根据record_1来进行排名的)


<?php
$stmtSelect = $pdo->prepare("
                        SELECT *
                        FROM m_order
                        WHERE
                            `game` = ? AND
                            `m_name` = ? AND
                            `station` = ? AND
                            `group` = ? AND
                            `event` = ? AND
                            `schedule` = ?
                        ORDER BY `order` ASC
                        ");
$stmtSelect->execute([$game, $m_name, $station, $group, $event, $schedule]);

$order_in = $stmtSelect->fetchAll(PDO::FETCH_ASSOC);

$record_1_values = [];

foreach ($order_in as $row) {
    $record_1 = (int)$row['record_1'];
    if ($record_1 !== 0 && !empty($record_1)) { 
        $record_1_values[] = $record_1;
    }
}

$ranks_1 = [];
$current_rank_1 = 1;
$previous_record_1 = null;

asort($record_1_values);

foreach ($record_1_values as $index_1 => $record_1) {
    if ($record_1 != $previous_record_1) {

        $current_rank_1 = count($ranks_1) + 1;
    }
    $ranks_1[$index_1] = $current_rank_1;
    $previous_record_1 = $record_1;
}

$record_1_to_rank_map = array_combine($record_1_values, $ranks_1);

foreach ($order_in as $index_1 => &$row) {
    $record_1 = (int)$row['record_1'];
    if (isset($record_1_to_rank_map[$record_1])) {

        $row['record_1'] = $record_1;
        $row['record_0'] = $record_1_to_rank_map[$record_1];
    } else {

        $row['record_1'] = $record_1;
        $row['record_0'] = null;
    }
}
foreach ($order_in as $row): ?>

                    <tr align="center" style="font-weight:bold;font-size:10px;">
                        <td><?php echo htmlspecialchars($row['order']); ?></td>
                        <td><?php echo htmlspecialchars($row['check']); ?></td>
                        <td><a style="font-size:13px"><?php echo htmlspecialchars($row['bib']); ?></a></td>
                        <td><?php echo htmlspecialchars($row['name']); ?><br>
                        <a style="font-size:8px;color:#8a8a8a"><?php echo htmlspecialchars($row['delegation']); ?></a></td>
                        <td><a style="color:#4d88e0">
                            <?php 
                            if ($row['record_1'] >= 9999990 ){
                                echo ""; 
                            } else{
                                echo htmlspecialchars($row['record_1']); 
                            }
                            ?>
                        </a></td>
                        <td><a style="color:#4d88e0"><?php echo htmlspecialchars($row['warn']).htmlspecialchars($row['penalty_1']); ?></a></td>
                        <td><a style="color:#4d88e0"><?php echo htmlspecialchars($row['result_1']); ?></a></td>
                        <td><span style="width:20px;background:#3d77b3"><a style="color:#FFF"><?php echo htmlspecialchars($row['record_0']); ?></a></span></td>
                        <td><?php echo htmlspecialchars($row['remark']); ?></td>
                    </tr>
                <?php endforeach; ?>
            </tbody>
        </table>
    </select>

  • 写回答

15条回答 默认 最新

  • 鱼弦 优质创作者: 编程框架技术领域 2024-07-12 18:23
    关注

    问题的根源在于你在计算排名时,某些record_1值可能被忽略了,或者没有正确映射。这可能导致最终显示时漏掉了一行。以下是一个改进的版本,它确保所有记录都有一个排名,并且解决重复的record_1导致排名丢失的问题。

    <?php
    $stmtSelect = $pdo->prepare("
        SELECT *
        FROM m_order
        WHERE
            `game` = ? AND
            `m_name` = ? AND
            `station` = ? AND
            `group` = ? AND
            `event` = ? AND
            `schedule` = ?
        ORDER BY `order` ASC
    ");
    $stmtSelect->execute([$game, $m_name, $station, $group, $event, $schedule]);
    
    $order_in = $stmtSelect->fetchAll(PDO::FETCH_ASSOC);
    
    // 提取 record_1 并排序
    $record_1_values = array_column($order_in, 'record_1');
    $record_1_values = array_filter($record_1_values, function($value) {
        return $value !== null && $value !== "" && $value != 0;
    });
    asort($record_1_values);
    
    $ranks_1 = [];
    $current_rank_1 = 1;
    $previous_record_1 = null;
    
    // 处理排名
    foreach ($record_1_values as $index_1 => $record_1) {
        if ($record_1 != $previous_record_1) {
            $current_rank_1 = count($ranks_1) + 1;
        }
        $ranks_1[$index_1] = $current_rank_1;
        $previous_record_1 = $record_1;
    }
    
    $record_1_to_rank_map = array_combine(array_keys($record_1_values), $ranks_1);
    
    // 为每一行赋值 ranking
    foreach ($order_in as $index_1 => &$row) {
        $record_1 = (int)$row['record_1'];
        if (isset($record_1_to_rank_map[$index_1])) {
            $row['record_1'] = $record_1;
            $row['record_0'] = $record_1_to_rank_map[$index_1];
        } else {
            $row['record_1'] = $record_1;
            $row['record_0'] = null;
        }
    }
    unset($row); // 解引用
    
    // 输出表格
    ?>
    <table>
        <thead>
            <!-- 表头 -->
        </thead>
        <tbody>
            <?php foreach ($order_in as $row): ?>
                <tr align="center" style="font-weight:bold;font-size:10px;">
                    <td><?php echo htmlspecialchars($row['order']); ?></td>
                    <td><?php echo htmlspecialchars($row['check']); ?></td>
                    <td><a style="font-size:13px"><?php echo htmlspecialchars($row['bib']); ?></a></td>
                    <td><?php echo htmlspecialchars($row['name']); ?><br>
                        <a style="font-size:8px;color:#8a8a8a"><?php echo htmlspecialchars($row['delegation']); ?></a></td>
                    <td><a style="color:#4d88e0">
                        <?php 
                        if ($row['record_1'] >= 9999990 ){
                            echo ""; 
                        } else{
                            echo htmlspecialchars($row['record_1']); 
                        }
                        ?>
                    </a></td>
                    <td><a style="color:#4d88e0"><?php echo htmlspecialchars($row['warn']).htmlspecialchars($row['penalty_1']); ?></a></td>
                    <td><a style="color:#4d88e0"><?php echo htmlspecialchars($row['result_1']); ?></a></td>
                    <td><span style="width:20px;background:#3d77b3"><a style="color:#FFF"><?php echo htmlspecialchars($row['record_0']); ?></a></span></td>
                    <td><?php echo htmlspecialchars($row['remark']); ?></td>
                </tr>
            <?php endforeach; ?>
        </tbody>
    </table>
    
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    1人已打赏
查看更多回答(14条)

报告相同问题?

问题事件

  • 系统已结题 7月21日
  • 已采纳回答 7月13日
  • 创建了问题 7月12日