我正在尝试按发布的值对关联数组进行排序,这是一个日期“%a,%e%b%Y%k:%i(%s)”
Array
(
[0] => Array
(
[starName] => Natalie Peri
[posted] => Wed, 2 Mar 2016 15:05(09) PM Pacific/Auckland
)
[1] => Array
(
[starName] => Taylor Hay
[posted] => Wed, 2 Mar 2016 15:34(37) PM Pacific/Auckland
)
[2] => Array
(
[starName] => Amber Dawn Fox
[posted] => Tue, 5 Jan 2016 5:54(48) PM Pacific/Auckland
)
[3] => Array
(
[starName] => Young Artist Awards 2016
[posted] => Mon, 14 Mar 2016 11:12(20) PM Pacific/Auckland
)
)
所以这将是Young,Natalie,Taylor,Amber。 (数组1 =得到键1和2,数组2得到键3和4顺便说一句)
我试过这个:
include("../database_connection.php");
$sth = "SELECT starName, date as posted
FROM blog
WHERE blog.approved =1
ORDER BY STR_TO_DATE( posted, '%a, %e %b %Y %k:%i(%s)' ) DESC
LIMIT 2";
$r = $dbc->query($sth);
$results = array();
while($row = $r->fetch_assoc()) {
$results[] = $row;
}
$sth2 = "SELECT starName, posted FROM questions
INNER JOIN stars ON questions.starID = stars.starID
INNER JOIN roles ON stars.starID = roles.starID
LEFT JOIN users ON users.userID = questions.userID
WHERE returned =1
AND most =1
ORDER BY STR_TO_DATE( posted, '%a, %e %b %Y %k:%i(%s)' ) DESC, questionID
LIMIT 2";
$r2 = $dbc->query($sth2);
$results2 = array();
while($row2 = $r2->fetch_assoc()) {
$results2[] = $row2;
}
$result = array_merge($results, $results2);
function compareByDate($item1, $item2) {
return strtotime($item1['posted']) - strtotime($item2['posted']);
}
usort($result, 'compareByDate');
echo "<pre>";
print_r($result);
echo "</pre>";
但Amber Dawn Fox总是先出现,有谁知道我哪里出错了?
答案 0 :(得分:2)
就像我在评论中所说,首先将其转换为unix时间戳,或者先使用DateTime
个对象。
我假设rsort
只是一个错字。你的意思是usort
。并($result, 'date_compare');
使用您的自定义函数名称:compareByDate
。它不匹配:
如果您碰巧使用DateTime
路线,只需使用createFromFormat
方法并提供您拥有的时间字符串格式。
D, j M Y G:i(s)
示例:
function compareByDate($item1, $item2) {
$a = DateTime::createFromFormat('D, j M Y G:i(s)', $item1['posted']);
$b = DateTime::createFromFormat('D, j M Y G:i(s)', $item2['posted']);
return $b->getTimeStamp() - $a->getTimeStamp();
}
usort($result, 'compareByDate');
这return $b->getTimeStamp() - $a->getTimeStamp();
(b - a)以递减的方式返回
当你需要提升时,将它交换为(a - b)。
旁注:如果出于某种原因,您希望保留关键关系,只需使用uasort
。
编辑:无论出于何种原因,您需要为用户呈现特殊时间格式,然后将其保留在查询中。我猜这种格式如下:
SELECT DATE_FORMAT(`timestamp_column`, '%a, %e %b %Y %k:%i(%s)') AS `posted`
请记住,只需在要包含的列的查询中添加原始timestamp_column
YYYY-MM-DD HH:MM:SS 。
SELECT DATE_FORMAT(`timestamp_column`, '%a, %e %b %Y %k:%i(%s)') AS `posted`, `timestamp_column`
然后使用strtotime
:
function compareByDate($item1, $item2) {
return strtotime($item2['timestamp_column']) - $item1['timestamp_column'];
}
usort($result, 'compareByDate');