【问题标题】:Defining a custom sorting for values and then getting the highest and lowest value from an array according to that sorting - PHP为值定义自定义排序,然后根据该排序从数组中获取最高和最低值 - PHP
【发布时间】:2016-03-29 14:18:26
【问题描述】:

我正在尝试创建一个这样的自定义评分系统:

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");

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

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

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

编辑:

只是为了清楚。预期结果是:

Highest: BB
Lowest: C

【问题讨论】:

  • 如果可以对数组进行排序,则最高值是第一个键,最低值是最后一个键。
  • 如何排序和选择数组的第一个和最后一个元素?那将是有效和简单的,但不是很有效。

标签: php arrays sorting usort


【解决方案1】:

此解决方案适用于您的原始 $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 您可以使用更少的命令/函数/比较。

【讨论】:

  • 两种解决方案都有效,但这确实是更好的性能:)
【解决方案2】:

你可以试试这个代码:

$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。

【讨论】:

  • 这似乎工作正常,除了它不承认 AAA 为最高评级。我正在为此制定解决方案,并会在找到时发布。感谢您的回答,我会在能够完成时接受它;)
  • 是的,很奇怪。您可以在 $ratings 中的“AAA”之前放置一个空字符串。它解决了这个问题。看看我的编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-18
相关资源
最近更新 更多