Сортировка многомерного массива для ранжирования с использованием PHP в CodeIgniter? - PullRequest
1 голос
/ 13 декабря 2011

Я хочу использовать результаты в массиве и отсортировать их, используя алгоритм ранжирования, подобный, например, Hacker News или Reddit.

Например, перефразируя алгоритм HN : Оценка = P / (T + 2) ^ G

where,
P = points of an item (e.g. votes + comments + likes)
T = time since submission (in hours)
G = Gravity, (on HN defaults to 1.8)

Из того, что я понимаю, мне нужно использовать массив сортировки PHP, но руководство по PHP вводит в заблуждение, и подобные ответы на StackOverflow имеют очень конкретные ответы без большого количества комментариев относительно того, что делает функция. например здесь , здесь & здесь .

Мои данные выглядят следующим образом

Array
(
    [0] => Array
        (
            [post_created] => 2011-12-12 07:18:17
            [post_num_likes] => 1
            [post_num_comments] => 0
            [post_message] => Some message
            [votes] => 16
        )

    [1] => Array
        (
            [post_created] => 2011-12-11 22:17:16
            [post_num_likes] => 0
            [post_num_comments] => 4
            [post_message] => Another message
            [votes] => 21
        )

    [2] => Array
        (
            [post_created] => 2011-12-11 20:21:11
            [post_num_likes] => 1
            [post_num_comments] => 2
            [post_message] => Next message
            [votes] => 1
        )

    [3] => Array
        (
            [post_created] => 2011-12-11 20:11:47
            [post_num_likes] => 0
            [post_num_comments] => 0
            [post_message] => Something else
            [votes] => 0
        )

    [4] => Array
        (
            [post_created] => 2011-12-11 20:09:46
            [post_num_likes] => 1
            [post_num_comments] => 0
            [post_message] => Another message 
            [votes] => 5
        )

Насколько я понимаю, мне нужно сделать что-то вроде следующего:

// Send array as 2nd parameter due to way you call functions in CodeIgniter
uksort($array, array('Class_name','postrank'));

function postrank($a, $b) {
    // some sorting function here
    return strcmp($a, $b);
}

Я пробовал копировать и вставлять различные функции, но поскольку они не так хорошо прокомментированы, трудно понять, что происходит.

Как мне повторить подобную функцию сортировки по рейтингу постов с вышеуказанными данными?

Ответы [ 3 ]

2 голосов
/ 13 декабря 2011

amidoinitrite

SELECT * , (
votes + post_num_comments + post_num_likes - 1
) / POW( ROUND( (
TIME_TO_SEC( TIMEDIFF( NOW( ) , post_created ) ) / 3600 ) + 2 ) , 1.8
) AS score
FROM hacker_news
ORDER BY score DESC

enter image description here

Формула на сайте фактически: Оценка = (P-1) / (T + 2) ^ G

2 голосов
/ 13 декабря 2011

Мой пример кода для PHP старше 5.3:)

<?php
function customSort($a, $b){
    foreach(array('a', 'b') as $vn){
        $tmp = $$vn;
        $p = $tmp['post_num_likes'] + $tmp['post_num_comments'] + $tmp['votes'];
        $t = ceil((time() - strtotime($tmp['post_created'])) / 3600);
        $$vn = $p / pow($t + 2, 1.81);
    }
    return $a - $b;
}
usort($array, 'customSort');

var_dump($array);
1 голос
/ 13 декабря 2011
$score = function($arr) {
    extract($arr);
    return ($votes + $comments + $likes) / pow($created_time + 2, 1.8);
};

usort($array, function($a, $b) use ($score) {
    return $score($a) - $score($b);
});

Это требует php 5.3, потому что я использовал анонимные функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...