What I'm trying to do is creating a custom rating system like this:
AAA - Highest rating
AA
A
BBB
BB
B
CCC
CC
C - Lowest rating
In which AAA is the highest and C the lowest. For this this to work I need PHP to know which rating is the highest, lowest and everything in between and evaluate series of ratings based on that. I allready figured out how to create a sorting with usort()
like so:
$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");
This will return an array neatly sorted from highest priority to lowest. Now I need to go ahead and use this sorting to get the highest and lowest rating from an array like this one:
$ratingHistory = array("BB", "B", "CCC", "C", "BB");
So how could I go about getting the highest and lowest value from $ratingHistory
based on the sorting as in $sortedRatings
? I hope someone can help me out with this one. If my problem isn't completely clear to you, drop a comment so I can try to explain further.
Edit:
Just to be clear. The expected outcomes would be:
Highest: BB
Lowest: C
This solution works with your original $ratings
array and — through usort()
— sort $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 );
Will print:
Array
(
[max] => BB
[min] => C
)
I have compared the performance of above example with a foreach()
, an array_map()
(all cases with both associative and enumerated array as $ratings
and with different $ratingHistory
sizes). The usort()
method is in anyhow far the more efficient. This because you have anyway to iterate complete array, but with usort
you can use less commands/functions/comparisons.