我有这个糟糕的排序函数,当在同一页面上调用两个排序函数时,它开始给我带来问题。它很可能会在同一个页面上被调用多次。
我希望能够调用排序函数并发送特定参数来确定排序的类型。这些包括由($arr['key']
)排序的字段,无论是字符串还是整数(strcmp
vs x - y
),以及比较(asc
vs desc
)的方向。
我怎样才能以一种不疯狂、不复杂、不混乱的方式做到这一点?我尝试了很多很多的搜索,但我发现很多东西都使用对象和类,这让我很困惑,我不知道如何发送更多的参数。
任何帮助,即使这是一个重复的问题,你有答案,将非常非常感激!
//awful sorting function
switch($sort) {
case 'photoname_asc':
function a_compare($a, $b) {
$t1 = $a['photoname'];
$t2 = $b['photoname'];
return strcmp($t1, $t2);
}
usort($photos, 'a_compare');
default;
break;
case 'photoname_desc':
function a_compare($a, $b) {
$t1 = $a['photoname'];
$t2 = $b['photoname'];
return strcmp($t2, $t1);
}
usort($photos, 'a_compare');
break;
case 'dateup_asc':
function a_compare($a, $b) {
$t1 = $a['id'];
$t2 = $b['id'];
return $t1 - $t2;
}
usort($photos, 'a_compare');
break;
case 'dateup_desc':
function a_compare($a, $b) {
$t1 = $a['id'];
$t2 = $b['id'];
return $t2 - $t1;
}
usort($photos, 'a_compare');
break;
}
下面是一个压缩switch语句的函数示例。警告,未经测试,但应该可以做到。
function photoStort(array &$photos, $key, $order) {
if ($order !== 'desc' && $order !== 'asc') {
return false;
}
usort($photos, function($a, $b) use ($key, $order) {
$t1 = $a[$key];
$t2 = $b[$key];
if (is_string($t1) && is_string($t2)) {
if ($order === 'asc') {
return strcmp($t1, $t2);
} else {
return strcmp($t2, $t1);
}
} elseif (is_int($t1) && is_int($t2)) {
if ($order === 'asc') {
return $t1 - $t2;
} else {
return $t2 - $t1;
}
} else {
trigger_error('Invalid type in photoSort!', E_WARNING);
}
});
}
$photos = array(/* Photos */);
//ex 1
photoSort($photos, 'photoname', 'asc');
//ex 2
photoSort($photos, 'id', 'desc');
PHP 5.2解决方案
function usortCallback($a, $b, $key, $order) {
$t1 = $a[$key];
$t2 = $b[$key];
if (is_string($t1) && is_string($t2)) {
if ($order === 'asc') {
return strcmp($t1, $t2);
} else {
return strcmp($t2, $t1);
}
} elseif (is_int($t1) && is_int($t2)) {
if ($order === 'asc') {
return $t1 - $t2;
} else {
return $t2 - $t1;
}
} else {
trigger_error('Invalid type in photoSort!', E_WARNING);
}
}
function photoSort(array &$photos, $key, $order) {
if ($order !== 'desc' && $order !== 'asc') {
return false;
}
usort($photos, create_function('$a, $b', 'return usortCallback($a, $b, "' . $key . '", "' . $order . '");'));
}