我有一个数组,看起来像这样,
$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>
还有另一种有效的方法可以根据用户的数量计算用户的评分吗? 或者我在计算中做错了什么? 感谢。
答案 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;对包含该函数的对象的引用和作为字符串的函数名称。