如何有效计数用户';s按点赞数排序


How to Efficently count user's rank by amout of likes?

我有一个数组,看起来像这样,

$users = array(
  0 => array(
     'user_id' => 'user_1',
     'likes'   => 50,
  ),
  1  => array(
     'user_id' => 'user_2',
     'likes'   => 72
  ),
  2  => array(
      'user_id' => 'user_3',
      'likes'   => 678
  )
);

我想做的就是根据点赞量来实现评分系统,这样它就会看起来像:

#rank 1 - user_3
#rank 2 - user_2
#rank 3 - user_1

我最终得到了

$user_counter = new User_Counter();
$user_counter->setData($users);
echo $user_counter->fetchRankByLikes(678);
class User_Counter
{
    protected $array;
    public function setData(array $array)
    {
        $this->array = $this->sort($array);
    }
    protected function sort(array $array)
    {
        $result = array();
        foreach ($array as $index => $_array) {
            $result[] = $_array['likes'];
        }
        // This will reset indexes
        sort($result, SORT_NUMERIC);
        $result = array_reverse($result);
        $return = array();
        $count  = 0;
        foreach ($result as $index => $rank) {
            $count++;
            $return[$count] = $rank;
        }
        $return = array_unique($return);
        return $return;
    }
    public function getAll()
    {
        return $this->array;
    }
    public function fetchRankByLikes($likes)
    {
        $data = array_flip($this->array);
        return $data[$likes];
    }
    public function fetchLikesByRank($rank)
    {
        return $this->array[$rank];
    }
}

我的问题是,这种方法有时会出错——例如,当根本没有点赞时(===即所有成员都有0个点赞),它会给出不正确的信息——在这种情况下,它会给他们所有人排第一。

有没有另一种有效的方法可以通过点赞量来计算用户的评分?或者我在计算中做错了什么?谢谢

如果你想提高效率,我会看看PHP原生的usort()函数:http://us1.php.net/manual/en/function.usort.php

usort所做的是获取一个数组并迭代遍历它,一次从它的输入中提供两个项目的外部函数。然后,它等待函数返回1、-1或0,并确定以下事实:

-1表示左<正确的+1表示左>右0表示两个参数的相等

这里有一个实际的例子:

$users = array(
        0 => array(
                'user_id' => 'user_1',
                'likes'   => 50,
        ),
        1  => array(
                'user_id' => 'user_2',
                'likes'   => 72
        ),
        2  => array(
                'user_id' => 'user_3',
                'likes'   => 678
        )
);
usort($users, "sortLikesAscending");
function sortLikesAscending($a, $b) {
    if ($a['likes'] > $b['likes']) {
        return 1;
    } elseif ($a['likes'] < $b['likes']) {
        return -1;
    } else {
        return 0;
    }
}

希望能有所帮助!

编辑:

如果你想从User_Counter类内部实现这个usort()方法,那么调用usort如下:

// From somewhere inside User_Counter, assumes User_Counter::mySortingFunction() is defined
usort($this->array, array(&$this, "mySortingFunction"));

函数回调作为一个包含两个条目的数组传递:一个&引用一个对象,该对象包含作为字符串的函数和函数名。