За последние 24 часа нас посетили 16534 программиста и 1578 роботов. Сейчас ищут 814 программистов ...

Сортировка Массивов

Тема в разделе "PHP для новичков", создана пользователем darrios, 6 ноя 2011.

  1. darrios

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

    С нами с:
    26 окт 2011
    Сообщения:
    17
    Симпатии:
    0
    Мне нужно сделать ТОП материалов по рейтингу!!!

    Рейтинго такой: 25/5 (5 звезд)
    Количество голосов: 5
    Каждый проголосовал по 5-ке. 5*5=25 рейтинг

    Мне нужно вывести из базы ТОП материалов. как можно отсортировать их
    1) по рейтингу (25)
    2) затем по количеству (если там несколько одинаковых рейтингов)

    Башка болит от этого уже
    пробовал по разному.

    Рейтинг и количество голосов находятся в разных колонках в БД SQL

    PHP:
    1. $query = mysql_query("SELECT id, artist, title, rating, total_votes FROM `mp3` WHERE `rating`>'0'");
    2.  
    3. while($array = mysql_fetch_array($query)){
    4.  
    5.  
    6.     $rating[] = $array['rating'];
    7.     //$total_votes[] = $array['total_votes'];
    8.     $id[] = $array['id'];
    9.  
    10.     $ratings[] = $array['rating']/$array['total_votes'];
    11.  
    12.     $massive[$array['rating']/$array['total_votes']][$array['rating']] = $array['id'];
    использовал arsort(); krsort();
    вообщем не смог...
    Нужна помощь...
     
  2. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    [sql]SELECT id, artist, title, rating, total_votes FROM `mp3` WHERE `rating`>'0' ORDER BY `rating`;[/sql]
     
  3. darrios

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

    С нами с:
    26 окт 2011
    Сообщения:
    17
    Симпатии:
    0
    Ага!!!
    Там материалы могут иметь высокий рейтинг, но они не должны выходить на первые места!!! Первыми могут те у которых пять балов, дальше ниже и ниже..

    Пример:
    Рейтинг |||| Кол-во голосов |||| Баллов (Р/Кол-во)
    25 |||||||||| 6 |||||||||||||| 4,1 < = Вот это должен быть на 2-м месте
    15 ||||||||| 3 ||||||||||||||| 5 < = Вот это должен быть на первом месте
    60 |||||||||| 15 ||||||||||||||| 4 < = Вот это должен быть на 3-м месте
     
  4. Mamont

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

    С нами с:
    5 дек 2010
    Сообщения:
    183
    Симпатии:
    0
  5. darrios

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

    С нами с:
    26 окт 2011
    Сообщения:
    17
    Симпатии:
    0
    Класс!!! Спасибо!!! Попробую использовать Ваш вариант, думаю тогда кода меньше будет!!!

    Я уже нашел другой вариант:

    PHP:
    1. $query = mysql_query("SELECT id, artist, title, rating, total_votes FROM `mp3` WHERE `rating`>'0' $country");
    2.  
    3. while($array = mysql_fetch_array($query)){
    4.  
    5. $massive[] = array(
    6.     'id' => $array['id'],
    7.     'rating' => ($array['rating']/$array['total_votes']),
    8.     'tatal_votes' => $array['total_votes'],
    9.     'artist' => $array['artist'],
    10.     'title' => $array['title'],
    11.     't_rating' => $array['rating'] );
    12. }
    13.  
    14.    
    15.  
    16. usort($massive, 'sort_by_rank');   
    17.    
    18. function sort_by_rank($a, $b) {
    19.     // Определяем порядок сортировки
    20.    
    21.     if ( $a['rating']  ==  $b['rating'] ) {
    22.          if ( $a['tatal_votes'] ==  $b['tatal_votes'] ) {
    23.         return 0;
    24.         }elseif($a['tatal_votes'] > $b['tatal_votes']){
    25.         return -1;}else{
    26.         return 1;}
    27.     }
    28.     return ( $a['rating']  > $b['rating'] ) ? -1 : 1;
    29. }  
    30.    
    31.  
    32. if(sizeof($massive) > 0){
    33.  echo "<table border=0 width="100%">";
    34.     for($i=0; $i<=sizeof($massive)-1; $i++){
    35.         echo "<tr><td>".$massive[$i]['artist']." - ".$massive[$i]['title']."</td><td width="15%">".$massive[$i]['rating']."/".
    36.         $massive[$i]['tatal_votes']." [". $massive[$i]['t_rating'] ."]</td></tr>";
    37.     }
    38.  echo "</table>";  
    39. }
    Считываем все в массив, затем сортируем массив функцией usort($massive, 'sort_by_rank');
    usort(); - дает возможность использовать свою функцию (sort_by_rank)