2013-02-22 107 views
0

這裏是我想要完成的一點小背景。我有一個正在顯示的MySQL查詢中的數組。我想根據一個因素對數組進行排序。係數根據文章發佈時間以內嵌方式計算得出&它收到的投票數。事情是這樣的:PHP - 基於排序數組的排序因子:: usort?

// ... MySQL query here 
$votes = $row['0'] 
$seconds = strtotime($record->news_time)+time(); 
$sum_total = pow($votes,2)/$seconds; 

所以陣列多數民衆贊成在未來看起來是這樣的:

Array (
    [0] => stdClass Object (
     [id] => 13 
     [news_title] => Article 
     [news_url] => http://website.com/article/14 
     [news_root_domain] => website.com 
     [news_category] => Business 
     [news_submitter] => 2 
     [news_time] => 2013-02-18 12:50:02 
     [news_points] => 2 
    ) 
    [1] => stdClass Object (
     [id] => 14 
     [news_title] => Title 
     [news_url] => http://www.website.com/article/2 
     [news_root_domain] => www.website.com 
     [news_category] => Technology 
     [news_submitter] => 1 
     [news_time] => 2012-10-02 10:03:22 
     [news_points] => 8 
    ) 
) 

我想用我上面提到的因素上述的陣列進行排序。這個想法是顯示列表中最高評分的文章(使用計算的因子),而不是數組進入的默認排序方法。看起來像usort可能是我最好的選擇,但讓我知道你都覺得呢?

+1

爲什麼不使用MySQL對這個因素進行排序?否則,'$ record'是什麼? 「投票」在哪裏起作用?我沒有看到這一點。 – Madbreaks 2013-02-22 18:38:13

+0

該因子未存儲在MySQL中。它是基於時間和投票動態生成的。票數是$ rValue - 在問題中重新命名,所以更清楚。 :)投票基本上來自數組內的「news_points」值。 $ record是我正在運行的每條語句。 – viablepath 2013-02-22 18:44:00

+0

@viablepath:那麼你如何計算'news_points'?這是一種總計,還是隻是記錄中列出的價值? – prodigitalson 2013-02-22 18:55:03

回答

1

完成所有的查詢:

SELECT n.*, (POW(?, 2)/(UNIX_TIMESTAMP(n.news_time) + UNIX_TIMESTAMP(NOW()))) as rank 
FROM news_table n 
ORDER BY rank; 
爲了得到選票,你可能需要做一個子查詢或連接,而是因爲你不給在哪裏足夠的信息,我不能對建議

現在選票來自。但是,您可以提供的票查詢以及替代選擇這一切在一拍一樣的東西:

$sql = sprintf('SELECT n.*, (POW(%d, 2)/(UNIX_TIMESTAMP(n.news_time) + UNIX_TIMESTAMP(NOW()))) as rank FROM news_table n ORDER BY rank', $votes); 

除此之外,是的,你可以使用usort,但是這也需要你有整個記錄在內存中提供準確的排序,這在某些時候可能會有問題。

+0

由於某些原因,只返回數組中的1個項目,而且格式很時髦。所以要清楚,你說我應該運行這個查詢,然後通過項目進行foreach以便正確顯示它們?這似乎是一個很好的解決方案,我只需要得到一個正常運行的查詢。謝謝你的幫助! :) – viablepath 2013-02-22 19:26:40

+0

是的,多數民衆贊成在說什麼。如果你可以發佈你的一些數據和你的表定義的轉儲,我不能幫助修復查詢。 – prodigitalson 2013-02-22 19:33:27

+0

此外,如果'news_points'始終是記錄中'news_points'的值,那麼您可以使用'POW(n.news_points,2)' – prodigitalson 2013-02-22 19:35:26