我正在尝试在多维数组中对数组(每个包含2个日期值)进行排序。我能够找到一个有用的函数来解决一个元素的问题,但是我无法将其修改为两个元素。
PHP Sort a multidimensional array by element containing date
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
)
};
答案 0 :(得分: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');
答案 1 :(得分:0)
我不确定是否理解正确,但你的意思是你想要根据column1(“post date”)对数组进行排序,如果这些值相等,则由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;
});