2012-11-23 63 views
0

我有這樣輸入:自定義比較功能,以穩定的排序在PHP

array 
    0 => 
     array 
      'task_uid' => '10214' 
      'createdate' => '2012-04-18 09:47:40' 
      'task_id' => '92966' 
    1 => 
     array 
      'task_uid' => '10214' 
      'createdate' => '2012-04-18 09:47:40' 
      'task_id' => '92967' 

我必須以穩定的方式進行排序它通過CREATEDATE。 我創建這個函數:

function compareTime($a, $b) { 
    $a_timestamp = strtotime($a["createdate"]); 
    $b_timestamp = strtotime($b["createdate"]); 
    if ($a_timestamp > $b_timestamp) 
     return -1; 
    else if ($a_timestamp < $b_timestamp) 
     return 1; 
    else 
     return 0; 
    //return strcmp($a["createdate"], $b["createdate"]); 
} 

usort($input, array($this, "compareTime")); 

應該從最早到最新的,但這種混合的數據進行排序。同樣,如果datacreate是相同的,那麼不會改變位置。 但如果我在compareTime使用:

return strcmp($a["createdate"], $b["createdate"]); 

然後,它改變來自例如元素(這是錯誤的對我來說)。你能給我答案我應該如何分類輸入?

+0

是從DB查詢生成的輸入數組?如果是這種情況,你可以使用'ORDER BY' – Naryl

+0

以正常方式在查詢中對它們進行排序。但是由於開發者的錯誤,我們混合了數據。正常的方式 - task_id應該沿着createdata增加。因爲錯誤,我們可以找到具有後期數據但早期task_id的元素。我們使用early_task_id來顯示歷史記錄(例如)。這是修理它的原因,並寫下這個方法 –

回答

1
function cmp($a, $b) 
{ 
    $a = strtotime($a['createdate']); 
    $b = strtotime($b['createdate']); 

    if ($a == $b) { 
     return 0; 
    } 
    return ($a < $b) ? -1 : 1; 
} 

usort($input, "cmp"); 

print_r($input); 

輸出(最舊到最新)

Array 
(
    [0] => Array 
     (
      [task_uid] => 10214 
      [createdate] => 2012-04-18 09:47:40 
      [task_id] => 92967 
     ) 

    [1] => Array 
     (
      [task_uid] => 10214 
      [createdate] => 2012-04-19 09:47:40 
      [task_id] => 92966 
     ) 

    [2] => Array 
     (
      [task_uid] => 9999 
      [createdate] => 2012-04-22 09:47:40 
      [task_id] => 9999 
     ) 

) 

Codepad demo


如果你想要做一個類中,例如排序使用該類的方法進行比較,可以這樣做:

class MyTest 
{ 
    public function __construct() 
    { 
     $input = array(
      0 => 
       array(
        'task_uid' => '10214', 
        'createdate' => '2012-04-19 09:47:40', 
        'task_id' => '92966'), 
      1=> array(
        'task_uid' => '9999', 
        'createdate' => '2012-04-22 09:47:40', 
        'task_id' => '9999'), 
      2 => 
       array(
        'task_uid' => '10214' , 
        'createdate' => '2012-04-18 09:47:40' , 
        'task_id' => '92967') 
     ); 

     usort($input, array($this, "cmp")); 

     print_r($input); 
    } 

    public function cmp($a, $b) 
    { 
     $a = strtotime($a['createdate']); 
     $b = strtotime($b['createdate']); 

     if ($a == $b) { 
      return 0; 
     } 
     return ($a < $b) ? -1 : 1; 
    } 
} 

$obj = new MyTest(); 

輸出與第一個例子相同。

+0

謝謝你的肛門。我們必須使用PHP 5.2.6(我不知道爲什麼,但是你的函數更改順序)。 –

+0

@BartoszKowalczyk沒問題:)如果這回答了你的問題,考慮通過點擊勾號接受答案。 – MrCode

+0

我在localhost上檢查了你的方式 - 這沒問題 - 但在服務器上它改變了順序。但是這仍然會改變產出。 –