我在 PHP 数组中有一些来自 XML 或 JSON 的数据,如下所示:
[0]= array(2) {
["title"]= string(38) "Another title"
["date"]= string(31) "Fri, 17 Jun 2011 08:55:57 +0200"
}
[1]= array(2) {
["title"]= string(38) "My title"
["date"]= string(31) "Mon, 16 Jun 2010 06:55:57 +0200"
}
我想做的是按日期订购这两件商品。
我不想做的事
我可以使用日期并将其设置为 ID,但这感觉不对,因为两个项目可以具有相同的日期,那么它就不是唯一的。
在排序之前,您不需要将日期转换为时间戳,但这是一个好主意,因为如果没有此步骤,排序将花费更多时间。
$data = array(
array(
"title" => "Another title",
"date" => "Fri, 17 Jun 2011 08:55:57 +0200"
),
array(
"title" => "My title",
"date" => "Mon, 16 Jun 2010 06:55:57 +0200"
)
);
function sortFunction( $a, $b ) {
return strtotime($a["date"]) - strtotime($b["date"]);
}
usort($data, "sortFunction");
var_dump($data);
在较新的 PHP 版本中,您也可以使用 箭头函数。在这里您可以找到上述内容的更简洁版本:
usort($data, fn ($a, $b) => strtotime($a["date"]) - strtotime($b["date"]));
使用usort:
usort($array, function($a1, $a2) {
$v1 = strtotime($a1['date']);
$v2 = strtotime($a2['date']);
return $v1 - $v2; // $v2 - $v1 to reverse direction
});
我建议使用 DateTime 对象而不是字符串,因为您无法轻松比较字符串,而这是排序所需的。您还可以获得处理日期的额外优势。
一旦有了 DateTime 对象,排序就非常容易了:
usort($array, function($a, $b) {
return ($a['date'] < $b['date']) ? -1 : 1;
});
他正在考虑将日期作为密钥,但担心值会被写在其他值之上,我想展示的只是(也许不是那么明显,这就是我编辑的原因)他仍然可以拥有完整的值,而不是写下来一举一动,这不好吗?!
<?php
$data['may_1_2002']=
Array(
'title_id_32'=>'Good morning',
'title_id_21'=>'Blue sky',
'title_id_3'=>'Summer',
'date'=>'1 May 2002'
);
$data['may_2_2002']=
Array(
'title_id_34'=>'Leaves',
'title_id_20'=>'Old times',
'date'=>'2 May 2002 '
);
echo '<pre>';
print_r($data);
?>