2016-03-15 25 views
-1

我試圖排序在公佈的值,它是一個日期相聯繫的數組 「%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 
     ) 

) 

因此,這將是年輕,娜塔莉,泰勒,琥珀。 (數組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>"; 

但琥珀黎明福克斯總是首先顯示了,沒有人知道,其中i」錯了嗎?

+0

的字符串轉換成日期Unix時間戳或DateTime對象自定義函數第一 – Ghost

+0

@Ghost感謝您的答覆中,如何將我去嗎?像這樣:'函數compareByDate($ ITEM1,ITEM2 $){$ ITEM1 = DATE_FORMAT($ ITEM1 [ '貼'], 'Y-M-d H:I:S'); $ item2 = date_format($ item2 ['posted'],'Y-m-d H:i:s'); return $ item1 - $ item2; }' – jenstar

+0

什麼是數據的來源? – 2016-03-15 02:31:38

回答

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

編輯:不管什麼原因,你需要那個特殊的年代格式化將要呈現給用戶,然後就離開這個完整的查詢。我想,格式如下:沿您要包含的列的查詢SS:

SELECT DATE_FORMAT(`timestamp_column`, '%a, %e %b %Y %k:%i(%s)') AS `posted` 

記住,只需添加原料timestamp_columnYYYY-MM-DD HH:MM。

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'); 
+0

什麼都沒有顯示在頁面上傳遞代碼,又名頁腳或print_r(),這是否重要,如果我'米使用低於PHP 5.3? – jenstar

+0

@ jenstar你什麼意思沒有顯示出來?你的意思是在你的環境中?我已經設置了在線演示,以便您可以檢查 – Ghost

+0

@jenstar yes它確實重要,['creaFromFormat'](http://php.net/manual/en/datetime.createfromformat.php)需要> = 5.3 – Ghost