如何根据喜欢的数量有效地计算用户排名?

时间:2013-11-30 00:41:01

标签: php

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

$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喜欢) - 在这种情况下,它给予他们所有人的第一等级。 / p>

还有另一种有效的方法可以根据用户的数量计算用户的评分吗? 或者我在计算中做错了什么? 感谢。

1 个答案:

答案 0 :(得分:1)

如果您正在寻找效率,我会查看原生于PHP的usort()函数: http://us1.php.net/manual/en/function.usort.php

使用数组并迭代地遍历它,提供一个外部函数,一次输入两个项目。然后它等待函数返回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"));

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