高效排名算法(PHP)

时间:2012-04-04 15:06:21

标签: php algorithm sorting

我有一个员工计算数据的PHP数组(从数据库中检索)。每个员工大约有10列,其中8个是数字(另外2个是id和name)。这是一个简短的样本:

David: 1024, 75,  22  
Mike:  500,  100, 25  
Jeff:  700,  82,  10  

我可以轻松地在任何(数字)字段上对数组进行排序,以显示谁在顶部/底部,但我最想在最终表视图中显示的是按值排名,所以人们赢了'我必须对表进行排序和重新排序以获得他们想要的东西。以下是按第一列排序的表格示例,显示括号中的排名:

David: 1024 (#1), 75  (#3), 22 (#2)  
Jeff:  700  (#2), 82  (#2), 10 (#3)  
Mike:  500  (#3), 100 (#1), 25 (#1)  

现在,我知道最简单的方法是按列对表进行排序,使用行索引作为排名,并按每列重复。我只是想知道我是否能找到更有效的方式。

我考虑过使用有序队列(每列一个需要排名),扫描一次数组并将值推入队列。但是:

  1. 除了数组之外,PHP没有任何数据结构(除非你使用外部添加)
  2. 我不相信这会更有效率。
  3. 有人可以建议最好的方法,和/或确认我应该多次重新排序数组吗?

    谢谢你的时间!

2 个答案:

答案 0 :(得分:1)

好的,经过深思熟虑后,我决定采用“排序每列”的路线。 为了将来有兴趣的人参考,这里是我添加到我班级的功能 - 每个我需要的专栏都会调用一次:

   private function calculateRankings(&$employees, $columnName) {
        $comparer = "return (\$a[$columnName][0] == \$b[$columnName][0]) ? 0 :  (\$a[$columnName][0] > \$b[$columnName][0] ? -1 : 1);";
        usort($employees, create_function('$a,$b', $comparer));
        foreach($employees as $key => &$employee) {
            $employee[$columnName][1] = $key + 1;
        }
    }

+1是由于密钥从零开始。

您可以通过将需要排序的每个字段转换为2个元素数组来准备此功能:第一个([0])包含值,第二个([1])将包含最后的排名。<登记/> 即:$employees['salary'] = array(1550, 0);。 然后你可以这样调用这个函数:
$this->calculateRankings($employees, 'salary');

我真诚地希望有一天能帮助某人。感谢所有响应者/评论者!

UPDATE 4/9:我之前提供的函数无法工作 - 无法将第三个参数(在我们的例子中,列名称)传递给comparer函数。唯一的方法是使用静态类变量,或者我最终使用的create_function hack。抱歉有任何困惑。

答案 1 :(得分:0)

我担心你必须坚持最初的方法。

不必遍历所有列并计算每个列的排名信息。

您可以做的是优化算法以更有效地完成该任务。

PS。:我认为算法不足以让您担心复杂性,增长顺序或运行时间,即使性能始终很重要。