为值定义自定义排序,然后根据该排序从数组中获取最高值和最低值 - PHP

Defining a custom sorting for values and then getting the highest and lowest value from an array according to that sorting - PHP

我想做的是创建一个像这样的自定义评级系统:

AAA - Highest rating
AA
A
BBB
BB
B
CCC
CC
C - Lowest rating

其中AAA最高,C最低。为此,我需要 PHP 知道哪个评级是最高的、最低的以及介于两者之间的所有评级,并据此评估一系列评级。我已经想出了如何使用 usort() 创建排序,如下所示:

$ratings = array("a" => "AAA", "b" => "AA", "c" => "A", "d" => "BBB", "e" => "BB", "f" => "B", "g" => "CCC", "h" => "CC", "i" => "C");
$sortedRatings = usort($ratings, "cmp_function");

这将 return 一个数组,从最高优先级到最低优先级整齐地排序。现在我需要继续使用此排序从这样的数组中获得最高和最低评分:

$ratingHistory = array("BB", "B", "CCC", "C", "BB");

那么我怎样才能根据 $sortedRatings 中的排序从 $ratingHistory 中获取最高值和最低值?我希望有人能帮我解决这个问题。如果您不完全清楚我的问题,请发表评论,以便我进一步解释。

编辑:

澄清一下。预期结果将是:

Highest: BB
Lowest: C

你可以试试这个代码:

$ratings = array("", "AAA","AA", "A", "BBB", "BB", "B", "CCC", "CC", "C");
$ratingHistory = array("BB", "B", "CCC", "C", "BB");

$min = 0;
$max = INF;
foreach ($ratingHistory as $row)
{
    $rate = array_search($row, $ratings);
    if ($rate && $rate > $min) {
        $min = $rate;
    }
    if ($rate && $rate < $max) {
        $max = $rate;
    }
}

echo 'Min : '. $ratings[$min];
echo '<br />Max : '. $ratings[$max];

如果您进行测试,您的示例的值为 BB 和 C。

此解决方案适用于您的原始 $ratings 数组,并且 - 通过 usort() - 排序 $ratingHistory:

$ratings = array("a" => "AAA", "b" => "AA", "c" => "A", "d" => "BBB", "e" => "BB", "f" => "B", "g" => "CCC", "h" => "CC", "i" => "C");
$ratingHistory = array("BB", "B", "CCC", "C", "BB");

usort
(
    $ratingHistory,
    function( $a, $b ) use( $ratings )
    {
        return strcmp( array_search( $a, $ratings ), array_search( $b, $ratings ) );
    }
);

$result = array( 'max'=>current($ratingHistory), 'min'=>end($ratingHistory) );

print_r( $result );

将打印:

Array
(
    [max] => BB
    [min] => C
)

性能:

我已经将上述示例的性能与 foreach()array_map() 进行了比较(所有情况下关联数组和枚举数组都为 $ratings 并且具有不同的 $ratingHistory尺寸)。 usort() 方法无论如何更有效。这是因为你无论如何都要迭代完整的数组,但是使用 usort 你可以使用更少的 commands/functions/comparisons.