我有一个数组,看起来像这样,
$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"));
函数回调作为一个包含两个条目的数组传递:一个&引用一个对象,该对象包含作为字符串的函数和函数名。