0

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

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

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

这是挑战:给定一个名字,他们在数组中的排名是多少?例如:莎拉=rank1;这似乎很简单,因为我认为我可以按值对数组进行排序,然后循环到所需的名称以获得排名。然而,奇怪的是,当我对数组进行排序时,它只是无济于事地返回 1!

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

我想我可以将数组放在 MySQL 表中,但这似乎有点笨拙。有人知道php解决方案吗?我在哪里做错了排序?我在这里阅读了文档,似乎 asort 是适当的功能(保留关联并按值排序)。

谢谢格林奇
_

4

3 回答 3

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 )  */
?>
于 2012-08-20T09:04:01.040 回答
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;

:-)

于 2012-08-20T09:22:26.933 回答
0

asort返回 bool 值,如此所述。

于 2012-08-20T09:05:04.053 回答