2011-06-08 139 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

相關問題