2012-02-01 9 views
3

PHPでend_timeの値でこの配列(最近のアイテムが最初に)を効率的にソートできますか?DateTime文字列で配列をソートする?

array 
    0 => 
    array 
     'value' => int 4 
     'end_time' => string '2012-01-20T08:00:00+0000' (length=24) 
    1 => 
    array 
     'value' => int 0 
     'end_time' => string '2012-01-21T08:00:00+0000' (length=24) 
    2 => 
    array 
     'value' => int 5 
     'end_time' => string '2012-01-22T08:00:00+0000' (length=24) 
    3 => 
    array 
     'value' => int 4 
     'end_time' => string '2012-01-23T08:00:00+0000' (length=24) 
    4 => 
    array 
     'value' => int 7 
     'end_time' => string '2012-01-24T08:00:00+0000' (length=24) 
+0

可能重複(http://stackoverflow.com/questions/1970207/sorting-a-two-dimensional-array)は、実際のタイムスタンプとして比較する –

答えて

16

usortDocsの機能を見ましたか? 2つの値を比較するためのコールバック関数を定義することができます。

function compare_func($a, $b) 
{ 
    // CONVERT $a AND $b to DATE AND TIME using strtotime() function 
    $t1 = strtotime($a["end_time"]); 
    $t2 = strtotime($b["end_time"]); 

    return ($t2 - $t1); 
} 

usort(main_array, "compare_func"); 
+3

+1。あなたの複雑なロジックは必要ではありません。ちょうど$ t2 - $ t1を返す。その値は、正、負または0のいずれかになります。これはソートに適しています。 – GordonM

+0

@GordonMあなたは100%正しいです。私はこれを訂正します。 – Roman

+0

@ GordonM文字列比較をしないのはなぜですか?すべての時間が同じタイムゾーン(UTC)の場合、これはより効率的ではないでしょうか?比較関数として['strcmp()'](http://uk.php.net/manual/en/function.strcmp.php)を使用してください。 – MrWhite

0

試してみてください:あなたはこのようなuasort機能を使用することができます

 

function sort_datewise($x, $y) { 
    $t1 = strtotime($x['end_time']); 
    $t2 = strtotime($y['end_time']); 
    return $t1 - $t2; 
}  
usort($array, 'sort_datewise'); 
 
0

は:このデータから来

$arr=array(); 
$arr[] = array('valeu' => "4", 'end_time' => '2012-01-20T08:00:00+0000'); 
$arr[] = array('valeu' => "0", 'end_time' => '2012-01-21T08:00:00+0000'); 
$arr[] = array('valeu' => "5", 'end_time' => '2012-01-22T08:00:00+0000'); 
$arr[] = array('valeu' => "4", 'end_time' => '2012-01-23T08:00:00+0000'); 
$arr[] = array('valeu' => "7", 'end_time' => '2012-01-24T08:00:00+0000'); 
print_r($arr); 
function cmp($a, $b) { 
    $ta = strtotime($a['end_time']); 
    $tb = strtotime($b['end_time']); 
    return ($ta - $tb); 
} 
uasort($arr, 'cmp'); 
print_r($arr); 
+0

あなたはまだこの時点で文字列を処理しているので、結果は非常に良いとは限りません(PHPで - 演算子で文字列を引くこともできますか?)。あなたはend_time文字列からタイムスタンプを生成し、代わりにそれらを比較する必要があります。 – GordonM

+0

申し訳ありません。$ ta = strtotime($ a ['end_time']); 'strtotime呼び出しなしでどのように入力したか分かりません。 – anubhava

4
usort($data, function($a, $b) { 
    return strtotime($a['end_time']) - strtotime($b['end_time']); 
}); 
0

がされるように、私はこれらの線に沿って何かを示唆していますデータベース?そうであれば、データベースをあなたのために並べ替えるだけです。 [2次元配列をソート]の

+0

いいえ、それはREST呼び出しです。 – gremo

1
usort($array, function($a, $b){ 
    return (strtotime ($a ['end_time']) 
      - strtotime ($b ['end_time'])) 
      * -1; 
}); 
+0

なぜ '-1'に掛けるのですか? 'usort'のドキュメントを読んだ後で、' $ a'が '$ b'の前にあれば、compare関数は負の数を返すはずですので、乗算は必要ないと思います。 – gremo

+0

予約注文のためのものです。 –

関連する問題