Php 使用附加参数进行排序,以确定所需的确切类型或排序
我有一个糟糕的排序函数,当两个函数在同一页上被调用时,它开始给我带来问题。它很可能在同一页上被多次调用 我希望能够调用排序函数并发送特定参数以确定排序类型。这些包括排序依据的字段(Php 使用附加参数进行排序,以确定所需的确切类型或排序,php,function,sorting,usort,Php,Function,Sorting,Usort,我有一个糟糕的排序函数,当两个函数在同一页上被调用时,它开始给我带来问题。它很可能在同一页上被多次调用 我希望能够调用排序函数并发送特定参数以确定排序类型。这些包括排序依据的字段(arr['key']),是字符串还是整数(strcmpvsx-y),以及比较方向(ascvsdesc) 我怎样才能以一种非疯狂、复杂和混乱的方式来做这件事?我尝试了大量的搜索,但是我发现了很多使用对象和类的东西,这让我很困惑,我不知道如何发送更多的参数 任何帮助,即使这是一个重复的问题,你有答案,将不胜感激 //awf
arr['key']
),是字符串还是整数(strcmp
vsx-y
),以及比较方向(asc
vsdesc
)
我怎样才能以一种非疯狂、复杂和混乱的方式来做这件事?我尝试了大量的搜索,但是我发现了很多使用对象和类的东西,这让我很困惑,我不知道如何发送更多的参数
任何帮助,即使这是一个重复的问题,你有答案,将不胜感激
//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');
PHP5.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 . '");'));
}
您不能“发送更多参数”是什么意思?只需将您的排序代码放入一个函数中。感谢您的快速回复,这看起来是一个非常好的建议!然而,我运行的是PHP5.2,之前我忘了提到它。我敢肯定,
usort($photos,function($a,$b)使用($key,$order)
对它不起作用。有简单的替代品吗?我正在创建一个插件,不想将其限制在5.3。谢谢!我为5.2添加了一个替代品。出于某种原因,我没有得到这个评论,实际上是自己想出来的。我做的稍微不同,但完全基于您的方式,但您的方法是正确的tter和我会适应的。谢谢!@maxiscool嘿,也许你可以进一步帮助我。使用你的函数,我在我的错误日志中得到了这个错误。[07-Jun-2013 19:19:12]PHP注意事项:使用未定义的常量photoname-假定photoname位于位置:运行时为photoname和asc创建的函数第1行
,或排序设置为的任何其他内容。该注意事项在usort create函数行触发。谢谢!它需要在参数周围加引号。“返回USORTCALLOCK($a,$b,“.”.$key.”,“.$order.”;”