我有一个员工计算数据的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)
现在,我知道最简单的方法是按列对表进行排序,使用行索引作为排名,并按每列重复。我只是想知道我是否能找到更有效的方式。
我考虑过使用有序队列(每列一个需要排名),扫描一次数组并将值推入队列。但是:
有人可以建议最好的方法,和/或确认我应该多次重新排序数组吗?
谢谢你的时间!
答案 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。:我认为算法不足以让您担心复杂性,增长顺序或运行时间,即使性能始终很重要。