usort用额外的参数来确定确切的类型或排序需要

问题描述:

我有这个糟糕的排序功能,当两个在同一页面上被调用时开始给我带来问题。它很可能会在同一页面上被多次调用。usort用额外的参数来确定确切的类型或排序需要

我希望能够调用排序函数并发送特定参数来确定排序的类型。其中包括按($arr['key'])排序的字段,无论是字符串还是整数(strcmp vs x - y)以及比较方向(ascdesc)。

我该如何以非疯狂,复杂和混乱的方式做到这一点?我尝试了很多很多的搜索,但是我发现了很多使用对象和类的东西,它让我感到困惑,而且我没有看到如何发送更多参数。

任何帮助,即使这是一个重复的问题,你有答案,将非常感激!

//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; 
} 

非常感谢。

+0

你是什么你的意思是不能 “发送更多的参数”?只需将你的排序代码放入一个函数中。 – Supericy 2013-04-25 02:21:07

下面是一个函数的例子,它可以浓缩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 . '");')); 
} 
+0

'使用($ key,$ order)' – webbiedave 2013-04-25 02:39:00

+0

感谢您的支持。 – maxiscool 2013-04-25 02:51:34

+0

感谢您的快速和什么看起来像一个很好的建议!但是,我在PHP 5.2上运行,我忘记提前它。我很确定'usort($ photos,function($ a,$ b)use($ key,$ order)' 不适用于它。是否有简单替换?我正在创建一个插件,并且不希望它限制为5.3。谢谢! – 2013-04-25 03:42:25