Afronden van naar specifieke decimalen met round in PHP

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Raf Rasenberg

Raf Rasenberg

10/11/2018 10:48:02
Quote Anchor link
Hallo,

Voor een website die ik ontwerp probeer ik een algemene review teller / gemiddelde in te voegen. Ik heb een script hiervoor gevonden op internet want ik ben zelf geen PHP held, maar nu probeer ik het getal te laten tonen met 2 decimalen maar dit lukt niet echt.

return '<p class="rating-average">'.round($average / $total_count, 2).' / 5 '. __('<i class="fa fa-star" style="font-size:25px;color:#0BBBEF"></i> STERREN').'</p>';

De ,2 na de total_count zou toch eigenlijk betekenen dat de round functie wordt gebruikt met 2 decimalen? Iemand enig idee waarom dit niet werkt?

Mvg,

Raf Rasenberg
Gewijzigd op 10/11/2018 10:49:30 door Raf Rasenberg
 
PHP hulp

PHP hulp

29/03/2024 14:38:59
 
Aad B

Aad B

10/11/2018 11:31:55
Quote Anchor link
Waar staan je php tags? Geef eventueel wat meer code en zorg dat de round als allerlaatste gedaan wordt, dus na de /5
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$average
= 12345,678;
$total_count = 50;
echo round(($average / $total_count)/5,2);
?>
Gewijzigd op 10/11/2018 11:35:35 door Aad B
 
Raf Rasenberg

Raf Rasenberg

10/11/2018 11:35:27
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?php
function get_total_reviews_count(){
    return get_comments(array(
        'status'   => 'approve',
        'post_status' => 'publish',
        'post_type'   => 'product',
        'count' => true
    ));
}

function
get_products_ratings(){
    global $wpdb;

    return $wpdb->get_results("
        SELECT t.slug, tt.count
        FROM {$wpdb->prefix}terms as t
        JOIN {$wpdb->prefix}term_taxonomy as tt ON tt.term_id = t.term_id
        WHERE t.slug LIKE 'rated-%' AND tt.taxonomy LIKE 'product_visibility'
        ORDER BY t.slug
    "
);
}

function
products_count_by_rating_html(){
    $star = 1;
    $html = '';
    foreach( get_products_ratings() as $values ){
        $star_text = '<strong>'.$star.' '._n('Star', 'Stars', $star, 'woocommerce').'<strong>: ';
        $html .= '<li class="'.$values->slug.'">'.$star_text.$values->count.'</li>';
        $star++;
    }

    return '<ul class="products-rating">'.$html.'</ul>';
}

function
products_rating_average_html(){
    $stars = 1;
    $average = 0;
    $total_count = 0;
    if( sizeof(get_products_ratings()) > 0 ) :
        foreach( get_products_ratings() as $values ){
            $average += $stars * $values->count;
            $total_count += $values->count;
            $stars++;
        }

        return '<p class="rating-average">'.round($average / $total_count, 2).' / 5 '. __('<i class="fa fa-star" style="font-size:25px;color:#0BBBEF"></i> STERREN').'</p>';
    else :
        return '<p class="rating-average">'. __('No reviews yet', 'woocommerce').'</p>';
    endif;
}

?>

Edit:
Ik heb code-tags geplaatst. Gelieve dit in het vervolg zelf toe te voegen aan je bericht.
Zie ook: Veel gestelde vragen: Welke UBB-codes kan ik gebruiken.



Toevoeging op 10/11/2018 11:37:44:

Het volledige script.

Toevoeging op 10/11/2018 11:39:43:

Waar zal ik nu deze ,2 moeten plaatsen?
Gewijzigd op 10/11/2018 11:37:31 door - Ariën -
 
Rob Doemaarwat

Rob Doemaarwat

10/11/2018 15:38:01
Quote Anchor link
Als het om de weergave gaat kun je beter number_format() gebruiken. Die rond ook af, maar zorgt ook meteen voor de juiste weergave ("5" wordt "5.00")
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
number_format($average / $total_count, 2)
 
Raf Rasenberg

Raf Rasenberg

10/11/2018 15:43:30
Quote Anchor link
@Rob dit heeft gewerkt. Bedankt voor de hulp!

Toevoeging op 10/11/2018 15:47:20:

Net even wat reviews toegevoegd, maar ik zie dat het nog steeds wordt afgerond. Terwijl ik round heb weggehaald. Hoe komt dit?

Toevoeging op 10/11/2018 19:13:17:

Ik wil het dus niet laten afronden, maar gewoon 1 decimaal tonen. Hoe doe ik dit?

Toevoeging op 10/11/2018 19:13:52:

Bump
 
Rob Doemaarwat

Rob Doemaarwat

10/11/2018 19:21:24
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
number_format($average / $total_count, 1)

Hiermee wordt afgerond op 1 cijfer achter de komma. Als $average = 15 en $total_count = 4, dan zal er "3.8" uit komen.

Laat anders je aangepaste code eens zien.
 
Raf Rasenberg

Raf Rasenberg

10/11/2018 19:28:35
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function products_rating_average_html(){
    $stars = 1;
    $average = 0;
    $total_count = 0;
    if( sizeof(get_products_ratings()) > 0 ) :
        foreach( get_products_ratings() as $values ){
            $average += $stars * $values->count;
            $total_count += $values->count;
            $stars++;
        }
        return '<p class="rating-average">'.number_format($average / $total_count, 1).' / 5.0 '. __('<i class="fa fa-star" style="font-size:25px;color:#0BBBEF"></i> STERREN').'</p>';
    else :
        return '<p class="rating-average">'. __('No reviews yet', 'woocommerce').'</p>';
    endif;
}


Dit is de code die ik nu gebruik, zoals jij zei heb ik de number_format gebruikt.

Toevoeging op 10/11/2018 19:29:26:

Afbeelding

Een screenshot hoe ik het nu zie op de front-end.

Toevoeging op 10/11/2018 19:33:36:

Ik heb nu bijvoorbeeld 1 reactie weggehaald. Er zijn 3 reviews
5+4+2=11 /3 = 3.66

Maar ik zie nu 4.0 staan.
 
Rob Doemaarwat

Rob Doemaarwat

10/11/2018 23:12:11
Quote Anchor link
Die berekening die daar staat klopt niet. Met 5/4/2 als values->count krijg ik:
- $stars = 1; $values->count = 5 -> $average += 1*5 = 5; $total_count += 5 = 5;
- $stars = 2; $values->count = 4 -> $average += 2*4 = 13; $total_count += 4 = 9;
- $stars = 3; $values->count = 2 -> $average += 3*2 = 19; $total_count += 2 = 11;

number_format($average / $total_count, 1) = "1.7" (dus ook niet "4.0", misschien staan de ratings in een andere volgorde).

Wat het volgens mij moet zijn is:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
function products_rating_average_html(){
    $total = 0;
    $total_count = 0;
    if( sizeof($ratings = get_products_ratings()) > 0 ) :
        //ik sla get_products_ratings() in $ratings om te voorkomen dat je alles dubbel doet (m.n. queries)
        foreach( $ratings as $values ) $total += $values->count; //totaal van de score
        $total_count = count($ratings); //totaal aantal ratings
        return '<p class="rating-average">'.number_format($total / $total_count, 1).' / 5.0 '. __('<i class="fa fa-star" style="font-size:25px;color:#0BBBEF"></i> STERREN').'</p>';
    else :
        return '<p class="rating-average">'. __('No reviews yet', 'woocommerce').'</p>';
    endif;
}
 
Thomas van den Heuvel

Thomas van den Heuvel

10/11/2018 23:32:33
Quote Anchor link
Misschien is de filosofie dat latere ratings (meer recent?) zwaarder wegen dan ratings in het verleden? Desalniettemin zou het inderdaad handig zijn als er in annotatie of documentatie wat toelichting kan worden gegeven over de betekenis van het eerder geplaatste codefragment. Is dit zo aangeleverd door een externe partij?

Het fragment van @Rob klinkt veel meer rechttoe rechtaan.
Gewijzigd op 10/11/2018 23:33:11 door Thomas van den Heuvel
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.