Php 数组中的数组

Php 数组中的数组,php,mysql,Php,Mysql,我有以下数组: $learners=array('Eliza'=87, 'Joe'=81, 'Anne'=69, 'Marley'=39, 'Teddy'=39, 'Jemma'=90, 'Sylvia'=87); 到目前为止,我已经能够按如下方式分离这两个阵列: $tudents=array_keys($learners); $scores=array_values($learners); Student Score Position Jemma 90

我有以下数组:

$learners=array('Eliza'=87,  'Joe'=81, 'Anne'=69, 'Marley'=39, 'Teddy'=39, 'Jemma'=90, 'Sylvia'=87);
到目前为止,我已经能够按如下方式分离这两个阵列:

$tudents=array_keys($learners);
$scores=array_values($learners);
Student    Score    Position
Jemma       90          1
Sylvia      87          2
Eliza       87          2
Joe         81          4
Anne        69          5
Marley      39          7
Teddy       69          7
排名如下:

$tudents=array_keys($learners);
$scores=array_values($learners);
Student    Score    Position
Jemma       90          1
Sylvia      87          2
Eliza       87          2
Joe         81          4
Anne        69          5
Marley      39          7
Teddy       69          7
我想创建一个新数组,名称作为键,位置作为值,即

$positions=array('Jemma'=1, 'Sylvia'=2, 'Eliza'=2, 'Joe'=4, 'Anne'=5, 'Marley'=7, 'Teddy'=7);
这将允许我在脚本上的任何位置回显任何名称和位置。我不知道如何进行

如果分数重复,排名就不简单了。如果2号出现平局,则跳过第3个位置。如果平局发生在分数结束时,则两个分数将放在最后一个位置,并跳过前面的位置。在上面的示例中,位置6已跳过,两个39将占据位置7

任何帮助都将不胜感激

看起来像PHP,对吗

基本上,检查你的初始列表,并将它们填充到一个新数组中,该数组使用名称作为键(如果两个人的名字相同,你会遇到麻烦,但我假设这是一个家庭作业,这不是问题?)

$sorted=array();

对于($i=0;$i),这里有另一个解决方案:

第一个按值排序(打印只是为了检查进度)

然后制作一个排名数组,但如果分数与前一个元素的分数相同,则不要提升排名

$rank = $pos = 1;
$prev_score = current($learners);
foreach ($learners as $name => $score) {
    if ($score != $prev_score) {
        $rank = $pos;
    }
    $ranking[$name] = $rank;
    $prev_score = $score;
    $pos++;
}
print_r($ranking);
现在更正最后一个条目,任何与最后一个元素得分相同的元素都应该排在第7位。数组_keys()中有一个很少使用的参数,用于搜索给定的值

$low_score = end($learners);
$last_place = count($learners);
foreach (array_keys($learners, $low_score) as $name) {
    $ranking[$name] = $last_place;
}
print_r($ranking);
输出:

Array
(
    [Jemma] => 90
    [Sylvia] => 87
    [Eliza] => 87
    [Joe] => 81
    [Anne] => 69
    [Marley] => 39
    [Teddy] => 39
)
Array
(
    [Jemma] => 1
    [Sylvia] => 2
    [Eliza] => 2
    [Joe] => 4
    [Anne] => 5
    [Marley] => 6
    [Teddy] => 6
)
Array
(
    [Jemma] => 1
    [Sylvia] => 2
    [Eliza] => 2
    [Joe] => 4
    [Anne] => 5
    [Marley] => 7
    [Teddy] => 7
)

我们是否可以假设您已经有了这些列组,或者您的问题是如何计算这些列组?那么
array\u merge()呢
?在上面的代码中还有很多可以优化的地方,但我正试图明确你想要做什么。谢谢,你的答案在某种程度上是有效的。问题是当出现平局时,它不会跳过一个或多个位置。例如,2号有平局,所以下一个学生应该被分配到位置4,如果是3号的话ents并列,那么下一个应该是第5位等等。不管是lsess,它让我了解了如何处理这个问题。是否可以从输出中删除int?@Bululu我已经更新了,虽然更改没有经过测试,但我认为它应该可以工作哇,我已经测试过了,它工作得非常好,不管是什么关系。Thaks很多。我有两个同样好的答案。感谢比尔·卡温和阿列克谢普的答案。比尔·卡温的答案也解决了问题,就像阿列克谢普的答案一样。我之所以将阿列克谢普的答案标记为可接受答案,只是因为@Bill Karwin比阿列克谢普享有更高的声誉,所以我认为阿列克谢普比比尔·卡温更需要一个可接受的答案来提高他的分数希望这是公平的。这是有用的,很好的数组操作!有可能必须将两者结合起来,并有一个解决方案来纠正这两个问题吗?就像一个考虑到数组末尾的平局和数组中其他地方的平局一样?我正在试着看看如何修改它。
// Sort decending
arsort($data);

$vals  = array_values($data);
$last  = end($vals);   // The lowest score
$prev  = null;
$rank  = 0;

$positions = array();
foreach($data as $student => $score) {
    if ($score == $last) {
        // The score is the same as the lowest, the rank is set to last position
        $rank = count($data);
    } else if ($prev != $score) {
        // We only update if the score is not the same as prev
        $rank++;
    }  else if ($prev == $score) {
     // We matched on the key, replace any items with the
     // same score with the current rank 
     $matches = array_keys($positions, $score);
     foreach($matches as $key) {
       $positions[$key] = $rank;
     }
     $positions[$student] = $rank;
     // Now skip ahead to the next rank +1
     $rank = $rank + count($matches) + 1;
     continue;
    }
    $positions[$student] = $rank;
    $prev = $score; // Remember the previous score
}
var_dump($positions);