note 92061 modified in function.uksort by danbrown
| From: | danbrown@php.net | Date: | Tue, 07 Jul 2009 15:35:07 +0000 |
| Subject: | note 92061 modified in function.uksort by danbrown | ||
| References: | 1 | Groups: | php.notes |
| Request: | Send a blank email to php-notes+get-158019@lists.php.net to get a copy of this message | ||
If you need to periodically sort by grades (A, A+, D-, etc.), here is a compare function that
compares strings by the case-insensitive method, unless it finds a grade, in which case it correctly
sorts by putting "plus" grades first, unmarked grades second, and "minus" grades
last.
<?php
function cmp($a, $b)
{
$a = preg_replace('@^(a|an|the) @', '', $a);
$b = preg_replace('@^(a|an|the) @', '', $b);
//special code for grades
if (strpos( $a, "+") !== false || strpos( $b, "+") !== false ||
strpos( $a, "-") !== false || strpos( $b, "-") !== false ){
$substrA = substr($a, 0, 1);
$substrB = substr($b, 0, 1);
$modifierA = (strlen($a) == 2) ? substr($a, 1, 1) : "";
$modifierB = (strlen($b) == 2) ? substr($b, 1, 1) : "";
if ($substrA == $substrB){
//figure out plusses and minuses.
if ($modifierA == "+"){
return -1;
} else if ($modifierB == "+"){
return 1;
}
if ($modifierA == "-"){
return 1;
} else if ($modifierB == '-'){
return -1;
}
} else {
return strcasecmp($a, $b);
}
}
return strcasecmp($a, $b);
}
$grades = array(
"C+" => 13 ,
"C" => 10 ,
"D+" => 8 ,
"B+" => 7 ,
"C-" => 6 ,
"A-" => 5 ,
"F" => 5 ,
"B" => 4 ,
"B-" => 4 ,
"D" => 3 ,
"D-" => 3 ,
"A+" => 1
);
uksort($grades, "cmp");
?>
result: Array
(
[A+] => 1
[A-] => 5
[B+] => 7
[B] => 4
[B-] => 4
[C+] => 13
[C] => 10
[C-] => 6
[D+] => 8
[D] => 3
[D-] => 3
[F] => 5
)
--was--
If you need to periodically sort by grades (A, A+, D-, etc.), here is a compare function that
compares strings by the case-insensitive method, unless it finds a grade, in which case it correctly
sorts by putting "plus" grades first, unmarked grades second, and "minus" grades
last.
function cmp($a, $b)
{
$a = preg_replace('@^(a|an|the) @', '', $a);
$b = preg_replace('@^(a|an|the) @', '', $b);
//special code for grades
if (strpos( $a, "+") !== false || strpos( $b, "+") !== false ||
strpos( $a, "-") !== false || strpos( $b, "-") !== false ){
$substrA = substr($a, 0, 1);
$substrB = substr($b, 0, 1);
$modifierA = (strlen($a) == 2) ? substr($a, 1, 1) : "";
$modifierB = (strlen($b) == 2) ? substr($b, 1, 1) : "";
if ($substrA == $substrB){
//figure out plusses and minuses.
if ($modifierA == "+"){
return -1;
} else if ($modifierB == "+"){
return 1;
}
if ($modifierA == "-"){
return 1;
} else if ($modifierB == '-'){
return -1;
}
} else {
return strcasecmp($a, $b);
}
}
return strcasecmp($a, $b);
}
$grades = array(
"C+" => 13 ,
"C" => 10 ,
"D+" => 8 ,
"B+" => 7 ,
"C-" => 6 ,
"A-" => 5 ,
"F" => 5 ,
"B" => 4 ,
"B-" => 4 ,
"D" => 3 ,
"D-" => 3 ,
"A+" => 1
);
uksort($grades, "cmp");
result: Array
(
[A+] => 1
[A-] => 5
[B+] => 7
[B] => 4
[B-] => 4
[C+] => 13
[C] => 10
[C-] => 6
[D+] => 8
[D] => 3
[D-] => 3
[F] => 5
)
http://php.net/manual/en/function.uksort.php