1

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

大卫:1024、75、22  
迈克:500、100、25  
杰夫:700、82、10  

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

大卫:1024(#1)、75(#3)、22(#2)  
杰夫:700(#2)、82(#2)、10(#3)  
迈克:500(#3)、100(#1)、25(#1)  

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

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

  1. PHP没有数组以外的任何数据结构(除非你使用外部添加)
  2. 我不相信这更有效。

任何人都可以建议最好的方法,和/或确认我应该多次重新排序数组吗?

谢谢你的时间!

4

2 回答 2

1

Ok, after much deliberation, I decided to go the "sort every column" route. For future reference by anyone interested, here's the function I've added to my class - it's called once per every column I need ranked:

   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;
        }
    }

The +1 is due to the keys being zero-based.

You prepare for this function by turning each field you need ranked into a 2-element array: the first ([0]) contains the value, and the second ([1]) will contain the rank in the end.
I.e.: $employees['salary'] = array(1550, 0);. You then call the function like this:
$this->calculateRankings($employees, 'salary');.

I sincerely hope this helps someone, someday. Thanks to all responders/commenters!

UPDATE 4/9: The function I supplied before couldn't work - there's no way to pass a third parameter (in our case, the column name) into the comparer function. The only way to do it is to use a static class variable, or a create_function hack that I ended up with. Sorry for any confusion.

于 2012-04-05T02:41:00.933 回答
0

恐怕您将不得不坚持最初的方法。

必须遍历所有列并计算每个列的排名信息,这是不可避免的。

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

PS.:我不认为该算法不寻常到足以让您担心复杂性、增长顺序或运行时间,即使性能总是很重要。

于 2012-04-04T17:09:34.410 回答