За последние 24 часа нас посетили 69409 программистов и 10307 роботов. Сейчас ищут 2895 программистов ...

сортировка массива функцией krsort

Тема в разделе "PHP для новичков", создана пользователем Oughtem, 4 фев 2009.

  1. Oughtem

    Oughtem Активный пользователь

    С нами с:
    4 фев 2009
    Сообщения:
    7
    Симпатии:
    0
    Прошу помощи знатоков. Есть некий плагин для некой КМС и некий файл этого плагина. Этот файл обрабатывает данные из базы и строит топ самых активных пользователей на сайте учитывая Дату Регистрации, кол-во комментариев, кол-во страниц, файлов и постов, определяя переменную "Рейтинг" и выводя таблицу с TOP10 юзеров

    Сам файл вот (извиняюсь за простыню - спойлера не нашёл)

    Код (Text):
    1.  
    2. <?PHP
    3.  
    4. /* ====================
    5. Seditio - Website engine
    6. Copyright Neocrome
    7. http://www.neocrome.net
    8.  
    9. [BEGIN_SED]
    10. File=plugins/activepanel/activepanel.php
    11. Version=100
    12. Updated=2007-sep-25
    13. Type=Plugin
    14. Author=faust64
    15. Description=
    16. [END_SED]
    17.  
    18. [BEGIN_SED_EXTPLUGIN]
    19. Code=activepanel
    20. Part=main
    21. File=activepanel
    22. Hooks=standalone
    23. Tags=
    24. Minlevel=0
    25. Order=10
    26. [END_SED_EXTPLUGIN]
    27.  
    28. ==================== */
    29. if (!defined('SED_CODE')) { die('Wrong URL.'); }
    30.  
    31. function count_val($sql_name, $field, $id)
    32. {
    33.         $count = 0;
    34.         mysql_data_seek($sql_name, 0);
    35.         while ($countrow = mysql_fetch_assoc($sql_name))
    36.                 {if ($countrow[$field] == $id){$count++;}}
    37.         return $count;
    38. }
    39.  
    40. function total_user_rating($page, $com, $posts, $pfs, $reg_date, $karma = 0, $medals = 0)
    41. {
    42.         $karma_div = ($karma != 0) ? 1 : 0;
    43.         $medals_div = ($medals != 0) ? 1 : 0;
    44.         $reg_time = (mktime(date(d),date(m),date(Y)) - $reg_date)/86400;
    45.         $total = ($page/4 + $com/10 + $posts/8 + $pfs/10 + $karma + $medals)/(5 + $karma_div + $medals_div);
    46.         return round($total, 2);
    47. }
    48.  
    49. $ekarma = $cfg['plugin']['activepanel']['ekarma'];
    50. $emedals = $cfg['plugin']['activepanel']['emedals'];
    51. $max_list = $cfg['plugin']['activepanel']['max_list'];
    52. $top_limit = $cfg['plugin']['activepanel']['top_limit'];
    53.  
    54. $sql = sed_sql_query("SELECT * FROM $db_users WHERE user_maingrp!='2' ORDER BY user_id");
    55. $sql1 = sed_sql_query("SELECT com_authorid FROM $db_com");
    56. $sql2 = sed_sql_query("SELECT page_ownerid FROM $db_pages");
    57. $sql3 = sed_sql_query("SELECT pfs_userid FROM $db_pfs");
    58.  
    59. clearstatcache();
    60.  
    61. if (file_exists("plugins/karma/"))
    62.         {
    63.                 $sql4 = sed_sql_query("SELECT karma_recipient FROM sed_karma");
    64.                 $f_karma = TRUE;
    65.         }
    66. else
    67.         {$f_karma = FALSE;}
    68.  
    69. if (file_exists("plugins/medals/"))
    70.         {
    71.                 $sql5 = sed_sql_query("SELECT medals_recipient FROM sed_medals");
    72.                 $f_medals = TRUE;
    73.         }
    74. else
    75.         {$f_medals = FALSE;}
    76.  
    77. $colkarma = ($ekarma && $f_karma) ? "<td class='coltop'>".$L['karma']."</td>" : "";
    78. $colmedals = ($emedals && $f_medals) ? "<td class='coltop'>".$L['medals']."</td>" : "";
    79.  
    80. $current = ($_GET['a']>0) ? $_GET['a'] : "0";
    81. $next = $current + $max_list;
    82. $prev = $current - $max_list;
    83. $user_list .= "<table class='cells'>";
    84. $user_list .= "<tr><td class='coltop'>".$L['uname']."</td><td class='coltop'>".$L['mngr']."</td><td class='coltop'>".$L['level']."</td><td class='coltop'>".$L['reg']."</td><td class='coltop'>".$L['com']."</td><td class='coltop'>".$L['page']."</td><td class='coltop'>".$L['pfs']."</td><td class='coltop'>".$L['post']."</td>".$colkarma.$colmedals."<td class='coltop'>".$L['rating']."</td></tr>";
    85. $current_pos = 0;
    86.  
    87. while ($row = mysql_fetch_assoc($sql))
    88.         {
    89.                 $current_pos++;
    90.                 if ($current_pos > $current && $current_pos <= $next)
    91.                 {
    92.                         $user = sed_build_user($row['user_id'], sed_cc(stripslashes($row['user_name'])));
    93.                         $mngrp = sed_build_group($row['user_maingrp']);
    94.                         $mgrpstrs = sed_build_stars($sed_groups[$row['user_maingrp']]['level']);
    95.                         $regdate = date("d.m.Y", $row['user_regdate']);
    96.                         $comcount = count_val($sql1, "com_authorid", $row['user_id']);
    97.                         $pagecount = count_val($sql2, "page_ownerid", $row['user_id']);
    98.                         $pfscount = count_val($sql3, "pfs_userid", $row['user_id']);
    99.                         $postcount = $row['user_postcount'];
    100.                         $karma = ($ekarma && $f_karma) ? count_val($sql4,"karma_recipient",$row['user_id']) : "0";
    101.                         $medals = ($emedals && $f_medals) ? count_val($sql5,"medals_recipient",$row['user_id']) : "0";
    102.                         $rating = total_user_rating($pagecount, $comcount, $postcount, $pfscount, $row['user_regdate'], $karma, $medals);
    103.                         $karma = ($ekarma && $f_karma) ? "<td>".$karma."</td>" : "";
    104.                         $medals = ($emedals && $f_medals) ? "<td>".$medals."</td>" : "";
    105.                         $user_array[$rating*100][$row['user_id']] = array("str" => "<tr><td>$user</td><td>$mngrp</td><td>$mgrpstrs</td><td>$regdate</td><td>$comcount</td><td>$pagecount</td><td>$pfscount</td><td>$postcount</td>".$karma.$medals."<td>$rating</td></tr>", "user" => $user);
    106.                 }
    107.         }
    108.  
    109. krsort($user_array);
    110.  
    111.  
    112. foreach($user_array as $k)
    113.         {
    114.                 foreach($k as $i)
    115.                         {
    116.                                 $user_list .= $i['str'];
    117.                                 if ($topcount < $top_limit){$top[] = $i['user'];}
    118.                                 $topcount++;
    119.                         }
    120.         }
    121.        
    122. $user_list .= "</table>";
    123.  
    124. $top_list = implode(', ', $top);
    125. $prev_link = ($current > 0) ? "<a href='plug.php?e=activepanel&a=".$prev."'><<< ".$L['prev'].$max_list."</a>" : "";
    126. $next_link = ($current < $current_pos-$max_list) ? "<a href='plug.php?e=activepanel&a=".$next."'>".$L['next'].$max_list." >>></a>" : "";
    127. ?>

    Всё считает, обрабатывает, но...
    В этом фале работает функция krsort($user_array), и работает коряво - она должна выводить сортировку по рейтингу, а выводит сортировку по дате регистрации юзера. Оч. прошу, подскажите, где подкрутить, чтоб сортировало по рейтингу, его же высчитываем!
     
  2. Oughtem

    Oughtem Активный пользователь

    С нами с:
    4 фев 2009
    Сообщения:
    7
    Симпатии:
    0
    Я попробовал uasort, usort, uksort. Заработало, сортирует по рейтингу, но везде ругается на значение ключа функции (как я понял)

    Warning: Wrong parameter count for uksort() in ..../activepanel.inc.php on line 108

    line 108 это
    Код (Text):
    1. krsort($user_array);
    что не правильно?
     
  3. Oughtem

    Oughtem Активный пользователь

    С нами с:
    4 фев 2009
    Сообщения:
    7
    Симпатии:
    0
    Абалденный форум. Всем спасибо за помощь, отзывчивость и оперативность! Модеры и админы, ТАК ДЕРЖАТЬ!
     
  4. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.341
    Симпатии:
    0
    неправильно:
    1. если Warning: Wrong parameter count for uksort() in ..../activepanel.inc.php on line 108
    то в 108 строке не может быть krsort($user_array);

    2. uksort требует два параметра - собственно массив и callback функцию сравнения. Собственно, Wrong parameter count и означает - неправильное количество параметров.

    Наверно админы и модеры решили что перевод с английского сообщения об ошибке не требует их вмешательства.
    Oughtem, так держать не надо.
     
  5. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    7.983
    Симпатии:
    1
    Адрес:
    Оттуда
    мы принимаем WMZ, WMR и Яд.
    =)