如何在不跳过任何排名的情况下使用重复值对数组值进行排名

时间:2014-02-03 07:39:03

标签: php

$marks = array(92, 84, 84, 84, 83, 65, 41, 38, 38, 37);

rank($marks);

必须导致:

92 - 1

84 - 2

84 - 2

84 - 2

83 - 3

65 - 4

41 - 5

38 - 6

38 - 6

37 - 7

我只能得到:

92 - 1

84 - 2

84 - 2

84 - 2

83 - 5

65 - 6

41 - 7

38 - 8

38 - 8

37 - 10

从代码中可以看出:

function _get_rank($arr, $key, $val){
        $i = 1;
        foreach ($arr as $v){
            if($v[''.$key.''] == $val){
                return $i;
            }
            $i++;
        }
    }

以上函数适用于我的实际情况,其中数组由具有某些 $ key 的对象组成,并且 $ val 是该值。

例如: _get_rank($marks, 'marks', 83)

  

必须返回3而不是5。

3 个答案:

答案 0 :(得分:0)

<?php

function rank ($arr) {

  $ret = array();
  $s = array();
  $i = 0;
  foreach ($arr as $v) {
    if (!$s[$v]) { $s[$v] = ++$i; }
    $ret[]= array($v, $s[$v]);
  }
  return $ret;
}

$marks = array(92, 84, 84, 84, 83, 65, 41, 38, 38, 37);
$rank = rank($marks);

print_r($rank);

输出

Array
(
    [0] => Array
        (
            [0] => 92
            [1] => 1
        )

    [1] => Array
        (
            [0] => 84
            [1] => 2
        )

    [2] => Array
        (
            [0] => 84
            [1] => 2
        )

    [3] => Array
        (
            [0] => 84
            [1] => 2
        )

    [4] => Array
        (
            [0] => 83
            [1] => 3
        )

    [5] => Array
        (
            [0] => 65
            [1] => 4
        )

    [6] => Array
        (
            [0] => 41
            [1] => 5
        )

    [7] => Array
        (
            [0] => 38
            [1] => 6
        )

    [8] => Array
        (
            [0] => 38
            [1] => 6
        )

    [9] => Array
        (
            [0] => 37
            [1] => 7
        )
)

答案 1 :(得分:0)

您的问题技术上错误,因为您不能为数组提供相同/重复的索引!


但是你可以做一个 echo

代码..

<?php
$marks = array(92, 84, 84, 84, 83, 65, 41, 38, 38, 37);
rsort($marks);
$narr = array_count_values($marks);
$y=1;
foreach($narr as $k=>$v)
{
$i=1;
while($i<=$v)
{
echo "$k : $y<br>";
$i++;
}
$y++;
}

<强> OUTPUT :

92 : 1
84 : 2
84 : 2
84 : 2
83 : 3
65 : 4
41 : 5
38 : 6
38 : 6
37 : 7

答案 2 :(得分:0)

这是另一个选项,它返回一个包含两个子数组的数组,一个包含数据,另一个包含排名。

$final_array = false;
$marks = array(92, 84, 84, 84, 83, 65, 41, 38, 38, 37);
$final_array = rank( $marks );

function rank( $array ) {
    // initialize variables
    $position_array = array();
    $copy_array = array();
    $final_array = array();
    $pos = 1;

    // reverse the array
    rsort( $array );

    // create copy to use on foreach
    $copy_array = $array;

    // iterate to generate ranking array
    foreach ( $copy_array as $claves => $valores ) {
        $position_array[] = $pos;
        unset( $copy_array[$claves] );
        if ( (bool)array_search( $valores, $copy_array, true ) !== false ) {
            // not much here for now.
        } else {
            $pos++;
        }
    }
    unset ( $claves, $valores );

    // create an array with values an position
    $final_array['data'] = $array;
    $final_array['ranking'] = $position_array;

    // clean up
    unset( $position_array, $copy_array );
    return $final_array;
}

// var_dump( $marks );
// var_dump( $final_array );

使用您的数据

array (size=2)
  'data' => 
    array (size=10)
     0 => int 92
     1 => int 84
     2 => int 84
     3 => int 84
     4 => int 83
     5 => int 65
     6 => int 41
     7 => int 38
     8 => int 38
     9 => int 37
  'ranking' => 
    array (size=10)
     0 => int 1
     1 => int 2
     2 => int 2
     3 => int 2
     4 => int 3
     5 => int 4
     6 => int 5
     7 => int 6
     8 => int 6
     9 => int 7