为值定义自定义排序,然后根据该排序从数组中获取最高值和最低值 - 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.
我想做的是创建一个像这样的自定义评级系统:
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.