使用可能的重复值对数组值进行排名

时间:2019-10-09 09:35:25

标签: php arrays

我试图对值数组进行排序,并保持原始数组中的顺序。

例如:

(6,4,7,12,7) should return (2,1,3,4,3)
(12,17,5,27,5) should return (2,3,1,4,1)
(1,1,4,6) should return (1,1,2,3)

在每种情况下,返回的数组都具有原始数组中相应元素的等级,重复值将具有相同的等级。

$values = array(12,17,5,27,5);
$sorted_values = $values;
sort($sorted_values);

foreach ($values as $key => $value) {
    foreach ($sorted_values as $sorted_key => $sorted_value) {
        if ($value == $sorted_value) {
            $rank_key = $sorted_key;
            break;
        }
    }
    echo $value . ' has rank: ' . $rank_key + 1 . '<br>';
}

4 个答案:

答案 0 :(得分:3)

一种简单的方法是首先对唯一值进行排名(使用array_unique(),然后依次为sort()),然后通过此新排名列表来转换原始列表(代码中有更多注释)...

$source = [12,17,5,27,5];

$output = [];
// Copy to work array unique values
$rank = array_unique($source);
// Sort it to produce ranking order
sort($rank);
// Make the number the key with the order as the value
$rank = array_flip($rank);
// Translate the values using $rank
foreach ( $source as $element ) {
    $output[] = $rank[$element]+1;
}
print_r($output);

给予...

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

答案 1 :(得分:1)

您需要sort您的数组

这可能接近您的答案:

<?php
$my_array=array(12,17,5,27,5);
$ordered_values = $my_array;
$rank=array();
rsort($ordered_values);
foreach ($ordered_values as $key => $value) {
    foreach ($ordered_values as $ordered_key => $ordered_value) {
        if ($value === $ordered_value) {
            $key = $ordered_key;
            break;
        }
    }
    $rank[$value]=((int) $key + 1) ;
}

foreach($my_array as $key => $value)
{
  echo $value.':'.$rank[$value].'<br>';
}
?>

答案 2 :(得分:1)

克隆数组,按值对克隆进行排序,同时保持键关联。

遍历克隆,并以经典的“控制中断”方式将当前项目的值与上一个项目的值进行比较。如果他们不同,则将等级提高一级。在该键下将该等级设置为新值。

按键对克隆进行排序。

$data = [12,17,5,27,5];

$clone = $data;
asort($clone);

$rank = 0;
$previous_value = null; // something that doesn't ever occur in your array values

foreach($clone as $key => $value) {
  if($value !== $previous_value) {
    $rank++;
  }
  $clone[$key] = $rank;
  $previous_value = $value;
}
ksort($clone);
var_dump($data, $clone);

答案 3 :(得分:1)

function rankDuplicateArray(array $array): array
{
    $copy = array_unique($array);
    sort($copy);
    $flipArray = array_flip($copy);

    return array_map(function($v) use ($flipArray) {
        return $flipArray[$v] + 1;
    }, $array);
}