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

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

Цитата
<?PHP

/* ====================
Seditio - Website engine
Copyright Neocrome
http://www.neocrome.net

[BEGIN_SED]
File=plugins/activepanel/activepanel.php
Version=100
Updated=2007-sep-25
Type=Plugin
Author=faust64
Description=
[END_SED]

[BEGIN_SED_EXTPLUGIN]
Code=activepanel
Part=main
File=activepanel
Hooks=standalone
Tags=
Minlevel=0
Order=10
[END_SED_EXTPLUGIN]

==================== */
if (!defined('SED_CODE')) { die('Wrong URL.'); }

function count_val($sql_name, $field, $id)
{
        $count = 0;
        mysql_data_seek($sql_name, 0);
        while ($countrow = mysql_fetch_assoc($sql_name))
                {if ($countrow[$field] == $id){$count++;}}
        return $count;
}

function total_user_rating($page, $com, $posts, $pfs, $reg_date, $karma = 0, $medals = 0)
{
        $karma_div = ($karma != 0) ? 1 : 0;
        $medals_div = ($medals != 0) ? 1 : 0;
        $reg_time = (mktime(date(d),date(m),date(Y)) - $reg_date)/86400;
        $total = ($page/4 + $com/10 + $posts/8 + $pfs/10 + $karma + $medals)/(5 + $karma_div + $medals_div);
        return round($total, 2);
}

$ekarma = $cfg['plugin']['activepanel']['ekarma'];
$emedals = $cfg['plugin']['activepanel']['emedals'];
$max_list = $cfg['plugin']['activepanel']['max_list'];
$top_limit = $cfg['plugin']['activepanel']['top_limit'];

$sql = sed_sql_query("SELECT * FROM $db_users WHERE user_maingrp!='2' ORDER BY user_id");
$sql1 = sed_sql_query("SELECT com_authorid FROM $db_com");
$sql2 = sed_sql_query("SELECT page_ownerid FROM $db_pages");
$sql3 = sed_sql_query("SELECT pfs_userid FROM $db_pfs");

clearstatcache();

if (file_exists("plugins/karma/"))
        {
                $sql4 = sed_sql_query("SELECT karma_recipient FROM sed_karma");
                $f_karma = TRUE;
        }
else
        {$f_karma = FALSE;}

if (file_exists("plugins/medals/"))
        {
                $sql5 = sed_sql_query("SELECT medals_recipient FROM sed_medals");
                $f_medals = TRUE;
        }
else
        {$f_medals = FALSE;}

$colkarma = ($ekarma && $f_karma) ? "<td class='coltop'>".$L['karma']."</td>" : "";
$colmedals = ($emedals && $f_medals) ? "<td class='coltop'>".$L['medals']."</td>" : "";

$current = ($_GET['a']>0) ? $_GET['a'] : "0";
$next = $current + $max_list;
$prev = $current - $max_list;
$user_list .= "<table class='cells'>";
$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>";
$current_pos = 0;

while ($row = mysql_fetch_assoc($sql))
        {
                $current_pos++;
                if ($current_pos > $current && $current_pos <= $next)
                {
                        $user = sed_build_user($row['user_id'], sed_cc(stripslashes($row['user_name'])));
                        $mngrp = sed_build_group($row['user_maingrp']);
                        $mgrpstrs = sed_build_stars($sed_groups[$row['user_maingrp']]['level']);
                        $regdate = date("d.m.Y", $row['user_regdate']);
                        $comcount = count_val($sql1, "com_authorid", $row['user_id']);
                        $pagecount = count_val($sql2, "page_ownerid", $row['user_id']);
                        $pfscount = count_val($sql3, "pfs_userid", $row['user_id']);
                        $postcount = $row['user_postcount'];
                        $karma = ($ekarma && $f_karma) ? count_val($sql4,"karma_recipient",$row['user_id']) : "0";
                        $medals = ($emedals && $f_medals) ? count_val($sql5,"medals_recipient",$row['user_id']) : "0";
                        $rating = total_user_rating($pagecount, $comcount, $postcount, $pfscount, $row['user_regdate'], $karma, $medals);
                        $karma = ($ekarma && $f_karma) ? "<td>".$karma."</td>" : "";
                        $medals = ($emedals && $f_medals) ? "<td>".$medals."</td>" : "";
                        $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);
                }
        }

krsort($user_array);


foreach($user_array as $k)
        {
                foreach($k as $i)
                        {
                                $user_list .= $i['str'];
                                if ($topcount < $top_limit){$top[] = $i['user'];}
                                $topcount++;
                        }
        }
       
$user_list .= "</table>";

$top_list = implode(', ', $top);
$prev_link = ($current > 0) ? "<a href='plug.php?e=activepanel&a=".$prev."'><<< ".$L['prev'].$max_list."</a>" : "";
$next_link = ($current < $current_pos-$max_list) ? "<a href='plug.php?e=activepanel&a=".$next."'>".$L['next'].$max_list." >>></a>" : "";
?>


=========================

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




Спустя 19 минут, 25 секунд (4.02.2009 - 01:26) REANIMATOR написал(а):
попробуй uksort вместо ksort

Спустя 2 минуты, 6 секунд (4.02.2009 - 01:28) REANIMATOR написал(а):
а вообще было бы неплохо узнать структуру $user_array путём функции print_r()
так как по всей видимости ключи этого массива не подходят к сортировке данной функцией

Спустя 7 часов, 44 минуты, 57 секунд (4.02.2009 - 09:13) Oughtem написал(а):
Так вот же структура в коде
Код
$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);


Почему вы решили, что ключи не подходят?

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

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

line 108 это
Код
krsort($user_array);


что-то не правильно...

Спустя 2 часа, 11 минут, 49 секунд (4.02.2009 - 11:25) REANIMATOR написал(а):
Цитата
Почему вы решили, что ключи не подходят?

smile.gif потому что не сортирует...

Цитата
Warning: Wrong parameter count for uksort() in ..../activepanel.inc.php on line 108
это значит что количество параметров которое получает функция не подходит...
например uksort() - получает два параметра. Первый- массив. Второй- функция с помощью которой идёт сорт (или по которой)...
почитай об этих функциях


Спустя 4 часа, 26 минут, 22 секунды (4.02.2009 - 15:51) Oughtem написал(а):
Это классно, что вы заставляете думать, но я вообще ничего не понимаю в PHP, хотя оч. хочу научиться хотя бы "читать" код. Я так понимаю, что кусок кода, где мне надо рыться это

Код
$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);
               }
       }

krsort($user_array);


foreach($user_array as $k)
       {
               foreach($k as $i)
                       {
                               $user_list .= $i['str'];
                               if ($topcount < $top_limit){$top[] = $i['user'];}
                               $topcount++;
                       }
       }


я хочу сам разобраться без прямой подсказки типа "замени это на это". Но я не понимаю до конца суть данного участка кода. Вот как я вижу этот код
1. uksort сортирует массив заданный этим: $user_array[$rating*100][$row['user_id']] = array("str" => ..... Индексом выступает [$rating*100], что такое [$row['user_id']] и array("str" => - я не пойму.
2. Идёт "обход" массива (это я читал) с помощью foreach. Зачем оно нужно я тоже не пойму. Но ладно, дальше. $user_array должен восприниматься как $k, $k как $i Зачем - не понятно.
3. Суть этого участка
Код
{
                               $user_list .= $i['str'];
                               if ($topcount < $top_limit){$top[] = $i['user'];}
                               $topcount++;
                       }

для меня вообще покрыта мраком.
Вот так и кручу этот код dry.gif

"Прочитайте" его пожалуйста, чтоб понятно было суть каждой переменной и действий над ними.

Спустя 1 час, 48 минут (4.02.2009 - 17:39) REANIMATOR написал(а):
Цитата
оч. хочу научиться хотя бы "читать" код

Есть некоторые базовые вещи типа: люпы, условия, и тому подобное чтобы примерно понять суть кода.
Я бы посоветовал отведать w3schools там базовые элементы очень хорошо объясняются, в том числе и массивы.

Но я могу в вкратце объяснить что обозначают те фрагменты кода.
  • Массив типа arra[$a][$b] это многомерный массив.
  • $arr = array("str" => "<tr><td>$user</td><td>..."); - это способ заполнит массив. тоже самое что и $arr['str']= "<tr><td>$user</td><td>..."
  • foreach- нужен в том случае когда ты не знаешь и не хочешь знать количество элементов в массиве. Он обходит каждый элемент массива и присваивает его к переменной $k. Т.е. теперь это к этому элементу можно относится как к отдельному переменному.
  • Поскольку массив многомерный значит в каждом из элементов $user_array[$rating*100] есть ещё один масив. Поэтому пройтись нужно и по нему ... Рассмотрим это как:
Код

$user_array['1000']= $array1;
$user_array['2000']= $array2;
$user_array['3000']= $array3;

  • ещё одна вещь о массивах. Они могут быть номерные типа arraн[1], или ключевые типа array['key'] - в которых индексом служит слово, а не число.

    в таком случае:
    $user_list .= $i['str'];
    if ($topcount < $top_limit){$top[] = $i['user'];}
    $topcount++;

    переменной $user_list добавляется элемент из массива $i где ключ равен 'str'.
    далее условие. При положительном ответе, добавляется к массиву $top, элемент который сидит в $i['user']

    затем $topcount возрастает на 1, т.е. $topcoun = $topcoun+1

  • Извиняюсь если что то намудрил, но если чёт не понятно спрашивай

    Спустя 5 часов, 28 минут, 46 секунд (4.02.2009 - 23:08) Oughtem написал(а):
    Цитата
    Заработало, сортирует по рейтингу

    Рано обрадовался wink.gif Я недосмотрел в конец списка рейтинга. Оказывается тут не совсем такая проблема как я описал изначально.

    Собственно krsort сортирует правильно. Этой функции просто подсунули не ту область сортировки. Короче... Переменная $max_list (кол-во пользователей на страницу) задаётся в админ части плуга. Если стоит 10, то сортирует в пределах 10, если 20, то в сортирует в пределах 20. Если у меня на сайте 147 зарегистрированных пользователей и я ставлю в админке $max_list=150, то вижу правильно отсортированный список студентов!

    krsort'у просто не то подсунули сортировать. Вот где надо копать!
    Т.е. должно быть не krsort($user_array)

    или массив $user_array должен включать в себя нечто другое чем
    Код
    $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);


    Кстати за что отвечает в $user_array[$rating*100][$row['user_id']] такая конфигурация как [$row['user_id']] ?

    Спустя 2 дня, 1 час, 57 минут, 18 секунд (7.02.2009 - 01:05) Oughtem написал(а):
    чё, никто не подскажет?

    Спустя 1 день, 16 часов, 45 минут, 59 секунд (8.02.2009 - 17:51) REANIMATOR написал(а):
    Цитата (Oughtem @ 4.02.2009 - 20:08)
    то вижу правильно отсортированный список студентов!

    так а вчём проблема?


    Цитата (Oughtem @ 4.02.2009 - 20:08)
    Кстати за что отвечает в $user_array[$rating*100][$row['user_id']] такая конфигурация как [$row['user_id']] ?


    $row['user_id']
    $row - это строка из базы данных. А ['user_id'] это так называемая колонка.


    Спустя 5 часов, 27 минут, 3 секунды (8.02.2009 - 23:18) Oughtem написал(а):
    Цитата
    так а вчём проблема?


    Мож я надоел уже, но проблема в том, что мне не надо выводить список всех пользователей. Мне надо вывести список пользователей по 10 человек. Вроде как ТОП10 сделать. Но по 10 сортирует неправильно.

    Я выставлю в настройках по 10, а вы сами гляньте

    Цитата
    $row['user_id']
    $row - это строка из базы данных. А ['user_id'] это так называемая колонка.


    А что именно отвечает $row['user_id']? За какой параметр?

    Спустя 6 минут, 39 секунд (8.02.2009 - 23:25) kirik написал(а):
    Цитата (Oughtem @ 8.02.2009 - 15:18)
    Я выставлю в настройках по 10, а вы сами гляньте

    Мож я чего не понимаю, но у меня все нормально выводится, по рейтингу в порядке убывания -
    user posted image

    Цитата (Oughtem @ 8.02.2009 - 15:18)
    А что именно отвечает $row['user_id']? За какой параметр?

    $row['user_id'] - это переменная (точнее элемент массива), в котором содержится уникальный номер пользователя (судя по названию).

    UPDЗЫ мой тысячный пост! user posted image Всем виски за мой счет!! biggrin.gif biggrin.gif

    Спустя 12 часов, 20 минут, 44 секунды (9.02.2009 - 11:45) Guest написал(а):
    Цитата
    Мож я чего не понимаю, но у меня все нормально выводится, по рейтингу в порядке убывания

    Где же нормально?
    Вот первая 10
    Вот вторая

    на второй своя сортировка, на 3-ей своя и т.д.

    Спустя 11 часов, 37 минут, 14 секунд (9.02.2009 - 23:23) kirik написал(а):
    Guest, давайте упростим немного задачу. Сделаем 2 массива, один - user_id => rating, второй - user_id => data (ваша табличка).
    Первый массив мы будем сортировать и на его основании выводить элементы второго.

    Тоесть, это -
    PHP
    $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);

    Заменим на это -
    PHP
    $tmp_u2r[$row['user_id']] = $rating * 100;
    $tmp_u2d[$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>
                                        <td>{$karma}{$medals}</td>
                                        <td>{$rating}</td>
                                    </tr>"
    ,
                            'user' => $user
                            
    );


    Это меняем
    PHP
    krsort($user_array);

    На это
    PHP
    asort($tmp_u2r);


    И потом выводим как нам нужно 10 штук-
    PHP
    $count = 0;
    foreach(
    $tmp_u2r as $user_id => $rating)
    {
        echo $tmp_u2d[$user_id]['str'];

        if($count == 10)
            break;

        $count++
    }


    Как-то так.. мог ошибиться, проверьте smile.gif

    Спустя 15 часов, 34 минуты, 33 секунды (10.02.2009 - 14:57) Гость_Oughtem написал(а):
    ничё не понял smile.gif, но ща буду тестить
    Быстрый ответ:

     Графические смайлики |  Показывать подпись
    Здесь расположена полная версия этой страницы.
    Invision Power Board © 2001-2025 Invision Power Services, Inc.