2013-02-22 102 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