2013-11-30 1 views
0

У меня есть массив, который выглядит следующим образом,Как эффективно подсчитать рейтинг пользователя amout из понравившихся?

$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 нравится) - в этом случае он дает им первый ранг.

Есть ли еще один эффективный способ подсчета рейтинга пользователя по количеству их понравившихся? Или что я делаю неправильно в своих вычислениях? Спасибо.

ответ

1

Если вы ищете для повышения эффективности, я хотел бы посмотреть на функции usort(), произрастающих в PHP: http://us1.php.net/manual/en/function.usort.php

Что usort делает взять массив и итеративно пройти через него, обеспечивая внешнюю функцию с 2 элемента из его ввода одновременно. Затем он ожидает функции для возврата или 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; 
    } 
} 

Надеюсь, что это поможет!

EDIT:

Если вы хотите реализовать эту usort() методологии внутри вашего класса User_Counter, а затем вызвать usort так:

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

Функция обратного вызова передается в виде массива с двумя входами : a & ссылка на объект, содержащий функцию и имя функции в виде строки.

Смежные вопросы