当前位置:首页 > PHP

php实现并列排名

2026-03-13 12:09:20PHP

PHP实现并列排名的方法

实现并列排名通常涉及对数据进行排序,并为相同值的项分配相同的排名,同时跳过后续的排名位置。以下是几种实现方式:

php实现并列排名

使用数组和循环进行排名

$scores = [85, 90, 78, 90, 92, 85];
rsort($scores); // 降序排序

$rankings = [];
$rank = 1;
$previousScore = null;

foreach ($scores as $index => $score) {
    if ($score !== $previousScore) {
        $rank = $index + 1;
    }
    $rankings[$score][] = $rank;
    $previousScore = $score;
}

print_r($rankings);

使用SQL查询实现并列排名

如果数据存储在数据库中,可以通过SQL直接计算并列排名:

php实现并列排名

SELECT score, 
       DENSE_RANK() OVER (ORDER BY score DESC) AS rank
FROM scores_table;

对应的PHP代码可能如下:

$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$stmt = $pdo->query('SELECT score, DENSE_RANK() OVER (ORDER BY score DESC) AS rank FROM scores_table');
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
print_r($results);

使用自定义函数处理并列排名

function calculateRanks(array $scores): array {
    arsort($scores); // 保持键值关联的降序排序
    $ranks = [];
    $rank = 1;

    foreach ($scores as $key => $score) {
        if (!isset($previousScore) || $score !== $previousScore) {
            $rank = count($ranks) + 1;
        }
        $ranks[$key] = $rank;
        $previousScore = $score;
    }

    return $ranks;
}

$scores = ['A' => 85, 'B' => 90, 'C' => 78, 'D' => 90, 'E' => 92, 'F' => 85];
$rankings = calculateRanks($scores);
print_r($rankings);

处理多维数组的排名

对于更复杂的数据结构,可能需要先提取排序字段:

$students = [
    ['name' => 'Alice', 'score' => 85],
    ['name' => 'Bob', 'score' => 90],
    ['name' => 'Charlie', 'score' => 78],
    ['name' => 'David', 'score' => 90],
    ['name' => 'Eve', 'score' => 92],
    ['name' => 'Frank', 'score' => 85]
];

usort($students, function($a, $b) {
    return $b['score'] - $a['score'];
});

$rank = 1;
$previousScore = null;

foreach ($students as &$student) {
    if ($student['score'] !== $previousScore) {
        $rank = count($students) - (array_search($student, $students) + 1) + 1;
    }
    $student['rank'] = $rank;
    $previousScore = $student['score'];
}

print_r($students);

注意事项

  • 使用DENSE_RANK()函数需要MySQL 8.0+或支持窗口函数的数据库版本
  • 降序排序时注意使用rsort()会重置数组索引,而arsort()保持键值关联
  • 处理并列排名时,后续排名数字是否跳过取决于具体需求(如1,2,2,4或1,2,2,3)

标签: php
分享给朋友:

相关文章

php实现定时任务

php实现定时任务

PHP 实现定时任务的几种方法 在 PHP 中实现定时任务可以通过多种方式完成,具体选择取决于项目需求和服务器环境。以下是常见的实现方法: 使用 Cron 任务 Cron 是 Linux 系统中常用…

php实现栈

php实现栈

栈的基本概念 栈(Stack)是一种遵循后进先出(LIFO)原则的数据结构。核心操作包括: push:元素入栈。 pop:元素出栈(返回并移除栈顶元素)。 peek:查看栈顶元素…

php实现表单

php实现表单

PHP 表单基础实现 创建一个简单的 PHP 表单需要 HTML 表单结构和 PHP 处理脚本。以下是一个完整的示例: HTML 表单部分 (form.html) <form action=…

php实现队列

php实现队列

PHP实现队列的方法 队列是一种先进先出(FIFO)的数据结构,PHP可以通过多种方式实现队列功能。 使用数组模拟队列 PHP数组可以模拟队列的基本操作,通过array_push和array_shi…

php 线程实现

php 线程实现

PHP 线程实现方法 PHP 本身是单线程语言,但可以通过扩展或库实现多线程功能。以下是几种常见的实现方式: 使用 pthreads 扩展 pthreads 是一个 PHP 扩展,允许在 PHP 中…

php 实现链表

php 实现链表

PHP 实现链表的方法 链表是一种线性数据结构,由节点组成,每个节点包含数据和指向下一个节点的指针。PHP 中可以通过类和对象来实现链表。 定义链表节点类 创建一个 ListNode 类,用于表示链…