自定义比较函数到PHP中的稳定排序

时间:2012-11-23 10:20:07

标签: php sorting

我的输入如下:

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' 

我必须以稳定的方式创建它。 我创建了这个函数:

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"]);

然后它从示例中更改元素(对我来说这是错误的)。你能否回答我应该如何分类输入?

1 个答案:

答案 0 :(得分: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();

输出与第一个示例相同。