我试图对值数组进行排序,并保持原始数组中的顺序。
例如:
(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>';
}
答案 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);
}