usort用额外的参数来确定确切的类型或排序需要
我有这个糟糕的排序功能,当两个在同一页面上被调用时开始给我带来问题。它很可能会在同一页面上被多次调用。usort用额外的参数来确定确切的类型或排序需要
我希望能够调用排序函数并发送特定参数来确定排序的类型。其中包括按($arr['key']
)排序的字段,无论是字符串还是整数(strcmp
vs x - y
)以及比较方向(asc
与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 . '");'));
}
'使用($ key,$ order)' – webbiedave 2013-04-25 02:39:00
感谢您的支持。 – maxiscool 2013-04-25 02:51:34
感谢您的快速和什么看起来像一个很好的建议!但是,我在PHP 5.2上运行,我忘记提前它。我很确定'usort($ photos,function($ a,$ b)use($ key,$ order)' 不适用于它。是否有简单替换?我正在创建一个插件,并且不希望它限制为5.3。谢谢! – 2013-04-25 03:42:25
你是什么你的意思是不能 “发送更多的参数”?只需将你的排序代码放入一个函数中。 – Supericy 2013-04-25 02:21:07