Afronden van naar specifieke decimalen met round in PHP
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
Code (php)
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
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;
}
?>
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.
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 -
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
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.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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;
}
$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:
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.
- $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)
1
2
3
4
5
6
7
8
9
10
11
12
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;
}
$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;
}
Het fragment van @Rob klinkt veel meer rechttoe rechtaan.
Gewijzigd op 10/11/2018 23:33:11 door Thomas van den Heuvel