在PHP数组中排名

时间:2012-08-20 09:00:31

标签: php arrays sorting ranking rank

我有一个与php数组相关的看似简单的排名类型问题,不幸的是经过大量研究后它打败了我:

我有一个简单的数组,其中键是人的名字,值只是相关的数字:

$myArray = Array("David"=>36, "James"=>24, "Sarah"=>70, "Mary"=>55);

以下是挑战:给出一个名字,他们在数组中的排名是什么?例如:Sarah = rank1;这似乎很简单,因为我想我可以通过值对数组进行排序然后循环到所需的名称以获得排名。但是,奇怪的是,当我对数组进行排序时,它只是无用地返回1!

print_r(asort($myArray)) = 1 (??)

我想我可以将数组放在MySQL表中,但这看起来有点沉重。有人知道php解决方案吗?我在哪里出错?我已阅读文档here,似乎asort是适当的函数(保留关联和对值进行排序)。

感谢
格林奇

3 个答案:

答案 0 :(得分:1)

asort函数返回一个布尔值,并将给定数组排序为引用

var_dump(asort($myArray)) = bool(true)

如果您在前一行之后print_r($myArray),则会在$myArray

中获取已排序的数组

编辑:重新阅读。

尝试这样做以获得众多排名:

<?php
    /* asort = Lower num to Upper */
    asort($myArray);
    /* arsort = Upper one to lower */
    // arsort($myArray);
    $ranks = array_fill(1,count($myArray),'foo');
    $ranked = array_combine(array_flip($myArray),array_keys($ranks));
    /* Output */
    print_r($ranked);
    /* Array ( [James] => 1 [David] => 2 [Mary] => 3 [Sarah] => 4 )  */
?>

答案 1 :(得分:1)

(编辑 - 现在工作)

有点难看,但这应该有效:

arsort($origArr);
$rankedArr = array_keys($origArr);
foreach ($rankedArr as $rank => $person) {
    if ($person == 'Sarah') {
        echo $rank + 1;
        break;
    }
}

您正在做的是首先按值排序,然后放弃这些值,只获取索引的人员列表。他们的键值+ 1 是他们的等级。 (因为第一个是0,对吗?)

EDIT2 - 略显清洁:

arsort($origArr);
$rankedArr = array_keys($origArr);
$finalRanks = array_flip($rankedArr);
$rank = $finalRanks['Sarah'] + 1;

: - )

答案 2 :(得分:0)

asort返回bool值,如here所述。