0

次のような入力があります。

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

次に、例から要素を変更します(私にとっては間違っています)。入力をどのようにソートすればよいか答えてもらえますか?

4

1 に答える 1

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
        )

)

コードパッドのデモ


クラス内で並べ替えを行いたい場合、たとえば比較のためにクラスのメソッドを使用する場合は、次のように実行できます。

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();

最初の例と同じように出力します。

于 2012-11-23T10:40:12.277 に答える