按日期值对关联数组进行排序

时间:2016-03-15 02:09:39

标签: php arrays function sorting datetime

我正在尝试按发布的值对关联数组进行排序,这是一个日期“%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总是先出现,有谁知道我哪里出错了?

1 个答案:

答案 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)

Sample Code

旁注:如果出于某种原因,您希望保留关键关系,只需使用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');