0

我正在尝试对多维数组中的数组(每个包含 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

我不确定是否理解正确,但您的意思是您希望根据 column1(“发布日期”)对数组进行排序,如果这些值相等,则顺序由 column2 确定。所以,你需要的只是修复你的比较功能:

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 回答