我用usort试过了,但是我没有成功。 我有以下数组:
array(
[0] => array(
'date' => '3:6:2012'
),
[1] => array(
'date' => '5:5:2012'
),
[2] => array(
'date' => '20:12:2011'
)
)
日期是d:m:yyyy格式,所以没有前导零。 我想对数组进行排序以获得此结果:
array(
[0] => array(
'date' => '20:12:2011'
),
[1] => array(
'date' => '5:5:2012'
),
[2] => array(
'date' => '3:6:2012'
)
)
我试过这种方式:
function cmp($a, $b) {
if($a['date'] = $b['date']) {
return 0;
}
$partsa = explode(":", $a['date']);
$partsb = explode(":", $b['date']);
$daya = $partsa[0];
$montha = $partsa[1];
$yeara = $partsa[2];
$dayb = $partsb[0];
$monthb = $partsb[1];
$yearb = $partsb[2];
if($yeara < $yearb) {
return -1;
} elseif($yeara > $yearb) {
return 1;
} elseif($yeara == $yearb) {
if($montha < $monthb) {
return -1;
} elseif($montha > $monthb) {
return 1;
} elseif($montha == $monthb) {
if($daya < $dayb) {
return -1;
} elseif($daya > $dayb) {
return 1;
} elseif($daya == $dayb) {
return 0;
}
}
}
}
但这并没有给出良好的结果... 怎么做?
答案 0 :(得分:0)
首先,让它们成为日期(正常,php可读日期):
foreach($array as $innerarray){
foreach($innerarray as $key=>$value){
$date = explode(":", $value);
$date = date($date[2]."/".$date[1]."/".$date[0]);
$array[$innerarray][$key] = $date;
}
}
在此之后,您可以使用以下功能对它们进行排序:
function sort_bydate($a, $b) {
return strnatcmp($a['date'], $b['date']);
}
// sort by date
usort($data, 'sort_bydate');
这应该可以解决问题。
顺便说一句,我建议不要在数组中使用数组,因为在你的情况下它是没用的。
答案 1 :(得分:0)
您可以使用标准化日期(yyyymmdd
)创建临时数组,然后使用array_multisort
:
$arr = array(
array(
'date' => '3:6:2012'
),
array(
'date' => '5:5:2012'
),
array(
'date' => '20:12:2011'
),
array(
'foo' => 'no date here'
),
);
foreach($arr as $key=>$row) {
if(isset($row['date'])) {
$date = explode(':',$row['date']);
$date = $date[2] . str_pad($date[1],2,'0',STR_PAD_LEFT) . str_pad($date[0],2,'0',STR_PAD_LEFT);
$sort_arr[$key] = $date;
} else {
$sort_arr[$key] = null;
}
}
array_multisort($sort_arr, SORT_ASC, $arr);
print_r($arr);
答案 2 :(得分:0)
PHP提供了strcmp
函数,它为我们做了比较。为了正确比较日期,我们创建了时间戳。
但首先我们需要解析字符串::
爆炸,最后将它们扔到mktime
。
function cmp($a, $b) {
$a = explode(':', $a['date']);
$a = mktime(0, 0, 0, intval($a[1]), intval($a[0]), intval($a[2]));
$b = explode(':', $b['date']);
$b = mktime(0, 0, 0, intval($b[1]), intval($b[0]), intval($b[2]));
return strcmp($a, $b);
}
注意:mktime
的前三个参数是小时,分钟和秒,在这种情况下可以忽略。