За последние 24 часа нас посетили 59463 программиста и 1856 роботов. Сейчас ищут 1404 программиста ...

Расчет среднего арифметического не учитывая ноль

Тема в разделе "Прочие вопросы по PHP", создана пользователем Andrey_S, 9 июл 2015.

  1. Andrey_S

    Andrey_S Новичок

    С нами с:
    9 июл 2015
    Сообщения:
    6
    Симпатии:
    0
    Здравствуйте.

    Решил доработать компонент отзывов, добавив возможность публиковать комментарий не выставляя оценку/рейтинг. Почти всё получилось, кроме правильного пересчета среднего арифметического всех оценок. Проблема в том, что система учитывает отзыв без рейтинга как 0 и он участвует в расчете, что существенно портит общую картину.

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

    Код вывода средней оценки:

    Код (Text):
    1. $rate_count = $this->analytic['review']->count_rate;
    2. $rate_avg = $rate_count==0? 0 : $this->analytic['review']->sum_rate/$rate_count;
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    В каком смысле чтобы ноль не учитывался? Распиши подробно алгоритм, какие входные данные, как считаешь.
     
  3. Andrey_S

    Andrey_S Новичок

    С нами с:
    9 июл 2015
    Сообщения:
    6
    Симпатии:
    0
    При написании отзыва пользователи выставляют оценки, далее эти оценки между собой суммируются и делятся на количество самих оценок. Если просто опубликовать отзыв не выставляя рейтинг, то система его учитывает как 0 и он суммируется с остальными оценками. И из-за этого общий рейтинг будет существенно занижаться. Потому нужно, чтобы отзывы с оценкой 0 не учитывались.
     
  4. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Код (Text):
    1. if ($rate===0){
    2. // не?
    3. }
     
  5. Andrey_S

    Andrey_S Новичок

    С нами с:
    9 июл 2015
    Сообщения:
    6
    Симпатии:
    0
    Уточните, пожалуйста, как именно вставить этот код?
     
  6. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Сдается мне, вы не поняли, что я написал от слова совсем? Давайте начнем с нуля - вы знаете, что такое оператор ветвления if?
     
  7. Andrey_S

    Andrey_S Новичок

    С нами с:
    9 июл 2015
    Сообщения:
    6
    Симпатии:
    0
    Да, знаю для чего он используется. Не знаю где его расположить.
     
  8. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Там, где идет вычисление рейтинга. Добавлять рейтинг в общее значение только если он >0. Вот и все.
     
  9. Andrey_S

    Andrey_S Новичок

    С нами с:
    9 июл 2015
    Сообщения:
    6
    Симпатии:
    0
    Я так понял нужно найти API объекта, получаемого из $this->analytic['review'] и там уже добавить этот код.
     
  10. osvical

    osvical Новичок

    С нами с:
    9 янв 2015
    Сообщения:
    67
    Симпатии:
    0
    например присвой -1 тем, кто не оценил.
    далее если(не -1), то суммируй, увеличивай счетчик оценивших. иначе ничего не делай.

    Добавлено спустя 2 минуты 40 секунд:
    а, стоп, или ноль это уже недопустимое значение? тогда вообще проблемы не понял)

    Добавлено спустя 15 минут 1 секунду:
    $this->analytic['review']->count_rate - хранит сколько человек оценили
    $this->analytic['review']->sum_rate - хранит их суммарную оценку

    тут дописывать уже поздно. надо искать место (скорее всего в каком нибудь методе addRateItem() ), в котором этим свойствам присваиваются значения и там уже прописывать влияние нуля
     
  11. Andrey_S

    Andrey_S Новичок

    С нами с:
    9 июл 2015
    Сообщения:
    6
    Симпатии:
    0
    Вроде нашел это место:
    Код (PHP):
    1. ...
    2.         public function get_analytics($object, $object_id, $object_key = '') {
    3.                 $params = JLexReviewFactory::getParams ();
    4.                 $result1 = null;
    5.                 $result2 = null;
    6.  
    7.                 if ($params->get ( 'show_summary_board' ) && $params->get ( 'show_rating_board' )) {
    8.                         $rate_max = $params->get ( 'rate_max' );
    9.  
    10.                         $where_clause = array ();
    11.                         $where_clause [] = "object=" . $this->getDbo ()->quote ( $object );
    12.                         $where_clause [] = "object_id=" . $this->getDbo ()->quote ( $object_id );
    13.                         $where_clause [] = "published=1";
    14.                         $where_clause [] = "review_rate<={$rate_max}";
    15.                         if (trim ( $object_key ) != '')
    16.                                 $where_clause [] = "object_key=" . $this->getDbo ()->quote ( $object_key );
    17.  
    18.                         $tmp = new stdClass ();
    19.                         $tmp->count_rate = 0;
    20.                         $tmp->sum_rate = 0;
    21.                         $tmp->count_vote = 0;
    22.  
    23.                         $query = "SELECT COUNT(review_rate) count_rate";
    24.                         $query .= ",SUM(review_rate) sum_rate";
    25.                         $query .= ",SUM(CASE WHEN rate=1 THEN 1 ELSE 0 END) count_vote";
    26.  
    27.                         for($i = 1; $i <= $rate_max; $i ++) {
    28.                                 $query .= ",SUM(CASE WHEN review_rate= {$i} THEN 1 ELSE 0 END) star{$i}";
    29.                                 $var = 'star' . $i;
    30.                                 $tmp->$var = 0;
    31.                         }
    32.  
    33.                         $query .= "\nFROM #__jlexreview";
    34.                         $query .= "\nWHERE " . implode ( " AND ", $where_clause );
    35.                         $query .= "\nGROUP BY object";
    36.                         $dt = $this->getDbo ()->setQuery ( $query, 0, 1 )->loadObject ();
    37.                         $result1 = ! $dt $tmp : $dt;
    38.                 }
    39. ...
    40.  
    Если это не оно, то подскажите, пожалуйста, как найти именно то место?

    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
     
  12. osvical

    osvical Новичок

    С нами с:
    9 янв 2015
    Сообщения:
    67
    Симпатии:
    0
    попробуйте найти где описан stdClass. а лучше, где значения с оценкой, пришедшие из формы, куда-то присваиваются.