2011-06-08 119 views
1

下面的usort函数并不总是给出正确的结果,因为它只会相对于比较的项目向上或向下“推”一个位置。因此,当执行多次分类时,结果Yes No Yes No可能发生。使用usort对多维数组进行排序

函数成功排序字段b。

我该如何解决这个问题?

阵列

[0] => array("a"=>"Yes","b"=>"apple"...); 
[1] => array("a"=>"Yes","b"=>"banana"...); 
[2] => array("a"=>"No","b"=>"lemon"...); 
[3] => array("a"=>"No","b"=>"grape"...); 
... 

当前功能

function sortAnserDesc($x, $y){ 
    if ($x['a'] == $y['a']) 
    return 0; 
    else if ($x['a'] < $y['a']) 
    return 1; 
    else 
    return -1; 
} 
+0

我不能重现你在说什么。对我而言,它有效。你使用什么PHP版本?你怎么调用usort函数? – 2011-06-09 13:17:07

+0

我手动编写了数组,您应该能够在对包含yes或no的6个以上字段进行排序时重现错误。 – Joseph 2011-06-11 16:16:45

回答

0

我发现了一个很不错的功能上http://www.php.net/manual/en/function.usort.php#103722 我认为你有一个普遍的问题。

我尝试在这里显示usort的回调函数。

function usortByArrayKey($key, $asc=SORT_ASC) { 
    $sort_flags = array(SORT_ASC, SORT_DESC); 

    if (!in_array($asc, $sort_flags)) 
     throw new InvalidArgumentException('sort flag only accepts SORT_ASC or SORT_DESC'); 

    return function(array $a, array $b) use ($key, $asc, $sort_flags) { 
       if (!is_array($key)) { //just one key and sort direction 
        if (!isset($a[$key]) || !isset($b[$key])) { 
         throw new Exception('attempting to sort on non-existent keys'); 
        } 
        if ($a[$key] == $b[$key]) 
         return 0; 
        return ($asc == SORT_ASC xor $a[$key] < $b[$key]) ? 1 : -1; 
       } else { //using multiple keys for sort and sub-sort 
        foreach ($key as $sub_key => $sub_asc) { 
         //array can come as 'sort_key'=>SORT_ASC|SORT_DESC or just 'sort_key', so need to detect which 
         if (!in_array($sub_asc, $sort_flags)) { 
          $sub_key = $sub_asc; 
          $sub_asc = $asc; 
         } 
         //just like above, except 'continue' in place of return 0 
         if (!isset($a[$sub_key]) || !isset($b[$sub_key])) { 
          throw new Exception('attempting to sort on non-existent keys'); 
         } 
         if ($a[$sub_key] == $b[$sub_key]) 
          continue; 
         return ($sub_asc == SORT_ASC xor $a[$sub_key] < $b[$sub_key]) ? 1 : -1; 
        } 
        return 0; 
       } 
      }; 
} 

,并与你的代码集成,你可能会碰到这样的:

  1. 只有降序排序a值。

    usort($YOUR_ARRAY, usortByArrayKey('a', SORT_DESC));

  2. 排序ab

    usort($YOUR_ARRAY, usortByArrayKey(array('a', 'b')));

  3. 更多关于排序ab通过DESCENDING

    usort($YOUR_ARRAY, usortByArrayKey(array('a', 'b')), SORT_DESC);

希望这有助于!

+0

生成解析错误:语法错误,在线100上的/file.php中出现意外的T_FUNCTION – Joseph 2011-06-09 07:53:30

+0

我忘了说,这只适用于PHP 5.3.x.或更高你的PHP版本是什么? – exodream 2011-06-10 22:22:43

0

为什么不直接使用strcmp函数?

function sortAnserDesc($x, $y){ 
    return strcmp($x['a'],$y['a']); 
} 
+0

导致相同的错误 – Joseph 2011-06-09 07:52:56