【问题标题】:PHP - Sort Array Based Off Factor :: usort?PHP - 基于非因子对数组进行排序:: usort?
【发布时间】:2013-02-08 11:16:11
【问题描述】:

这里是我想要完成的一些背景知识。我有一个来自正在显示的 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 可能是我最好的选择,但是让我知道你们的想法?

【问题讨论】:

  • 为什么不使用 MySQL 对该因素进行排序?否则,$record 是什么? “投票”在哪里发挥作用?我没有看到任何提及。
  • 该因子未存储在 MySQL 中。它是根据时间和投票动态生成的。投票是 $rValue - 在问题中重命名,因此更清楚。 :) 投票基本上是从数组内的“news_points”值填充的。 $record 是我正在运行的每个语句的。
  • @viablepath:那么您如何计算news_points?它是某种总数,还是仅是记录中列出的值?
  • 就是记录中的值。每次记录投票时,我都会更新记录。
  • 我知道这个因子没有存储在 MySQL 中,但您当然可以将其作为查询的一部分进行计算,然后对其进行排序。

标签: php mysql arrays object


【解决方案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,但这也需要您将整个记录集保存在内存中以提供准确的排序,这在某些时候可能会出现问题。

【讨论】:

  • 出于某种原因,它只返回数组中的一项,格式很时髦。所以要清楚,你说我应该运行这个查询,然后遍历这些项目以便正确显示它们?这似乎是一个很好的解决方案,我只需要获得一个有效的查询。谢谢你的帮助! :)
  • 是的,我就是这么说的。如果您可以发布一些数据和表定义的转储,我无法帮助修复查询。
  • 另外,如果news_points 始终是记录中news_points 的值,那么您可以只使用POW(n.news_points, 2)
  • Array ( [0] => 8 [id] => 8 [1] => 文章标题 [news_title] => 文章标题 [2] => website.com/article/1 [news_url] => @ 987654322@ [3] => website.com [news_root_domain] => website.com [4] => [news_category] ​​=> [5] => 1 [news_submitter] => 1 [6] => 2013-02-18 10:40:41 [news_time] => 2013-02-18 10:40:41 [7] => 0 [news_points] => 0 [8] => 0 [rank] => 0)
  • 为什么news_points 是一个varchar?它应该是数字,很可能是integer。这可能是问题的一部分
最近更新 更多