0

多次元配列で配列 (それぞれに 2 つの日付値を含む) を並べ替えようとしています。1 つの要素の問題を解決する便利な関数を見つけることができましたが、2 つの要素については変更できませんでした。

PHP 日付を含む要素で多次元配列をソートする

function date_compare($a, $b)
{
    $t1 = strtotime($a['datetime']);
    $t2 = strtotime($b['datetime']);
    return $t1 - $t2;
}    
usort($array, 'date_compare');

当面の問題は、投稿時間と編集時間を持つコメントをソートすることです。基本的に、新しいものから古いものへと並べ替えたいと思います (両方の値を保持しながら)。

これが不可能な場合は、お知らせください。

編集:モックアップ

$array = array(
    [0] => array(
          [0] => "Aug:1:2012 12:00:pm", // post date
          [1] => "Aug:28:2012 12:00:pm"  // edit date
    ),
    [1] => array(
          [0] => "Aug:1:2012 12:00:pm",
          [1] => "Aug:30:2012 12:00:pm"
    )
    [2] => array(
          [0] => "Aug:29:2012 12:00:pm",
          [1] => "Aug:1:2012 12:00:pm"
    )
};

出力する必要があります: 最初に $array[1] (キー 1 と 2 の中で最も高い日付があるため)、次に $array[2]、次に $array[0] です。

$array = array(
    [0] => array(
          [0] => "Aug:1:2012 12:00:pm",
          [1] => "Aug:30:2012 12:00:pm" // highest   
    ),
    [1] => array(
          [0] => "Aug:29:2012 12:00:pm", // next
          [1] => "Aug:1:2012 12:00:pm"
    )
    [2] => array(
          [0] => "Aug:1:2012 12:00:pm",
          [1] => "Aug:28:2012 12:00:pm" // lowest
    )
};
4

2 に答える 2

1

並べ替え関数は、最初にどちらの日付が新しいか (投稿日または編集日) を特定し、それを比較に使用する必要があります。

function sort_arr($arr1, $arr2) {
    $this_posted = strtotime($arr1[0]);
    $this_edited = strtotime($arr1[1]);
    $comparison_posted = strtotime($arr2[0]);
    $comparison_edited = strtotime($arr2[1]);
    $this_date = $this_posted > $this_edited ? $this_posted : $this_edited;
    $comparison_date = $comparison_posted > $comparison_edited ? $comparison_posted : $comparison_edited;
    return $this_date > $comparison_date;
}

$arr = array(
    array("Aug:1:2009 12:00:pm", "Aug:2:2009 12:00:pm"),
    array("Aug:1:2011 12:00:pm", "Jul:21:2012 12:00:pm"),
    array("Aug:5:2011 12:00:pm", "Jan:21:2013 12:00:pm")
);

usort($arr, 'sort_arr');
于 2012-08-30T12:03:10.867 に答える
0

正しく理解されているかどうかはわかりませんが、列1(「投稿日」)に基づいて配列を並べ替えたいという意味で、これらの値が等しい場合は列2によって決定されます。したがって、必要なのは比較関数を修正することだけです。

function date_compare($a, $b)
{
    $t1 = strtotime($a['datetime']);
    $t2 = strtotime($b['datetime']);
    if ($t1 != $t2) {
        return $t1 - $t2;
    }

    // if "post dates" are equal, compare "edit dates"
    $t1 = strtotime($a['datetime2']);
    $t2 = strtotime($b['datetime2']);

    return $t1 - $t2;
}    

編集:

わかりました、コメントによると、配列から最大要素を取得するだけです。したがって、これは機能するはずです:

usort($array, function($a, $b) {
    $t1 = max(strtotime($a[0]), strtotime($a[1]));
    $t2 = max(strtotime($b[0]), strtotime($b[1]));

    return $t1 - $t2;
});
于 2012-08-30T11:58:57.563 に答える