PHP - 排序数组基于因子:: usort?

时间:2013-02-22 18:36:35

标签: php mysql arrays object

这里有一些关于我想要完成的事情的背景知识。我有一个正在显示的MySQL查询的数组。我想根据一个因素对数组进行排序。该因子是根据文章发布的时间内联计算的。收到的票数。像这样:

// ... 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 个答案:

答案 0 :(得分: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,但这也需要您将整个记录集放在内存中以提供准确的排序,这在某些时候可能会有问题。