Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Procenty
Forum PHP.pl > Forum > PHP
matt
Witam
Robie skrypt do dodawania piłkarzy do skarbu kibica. Dodawanie juz skonczyłem, i przy wyświetlaniu chciałem zrobić taki bajer, ile dany piłkarz strzelil bramek w poszczególnych minutach. Przyjołem że poszczególne minuty to bedą między 1 a 15 min. między 16 a 30 min. między 31 a 45 min. między 46 a 60 min. między 61 a 75 min. między 76 a 90 min.
np
bramki między 1 a 15 min. 10%
bramki między 16 a 30 min. 10%
bramki między 31 a 45 min. 10%
bramki między 46 a 60 min. 10%
bramki między 61 a 75 min. 30%
bramki między 76 a 90 min. 30%
i teraz własnie się zaciłem jak zrobic takie cos, zeby to się wyświetlało w procentach.

Tak wygląda kawałek kodu:
Cytat
[php:1:b2d0b2a694]<?php
$sql = mysql_query("SELECT * FROM pilkarze ORDER BY id_pilkarza");

while($row = mysql_fetch_array($sql))
{
$id=$row['id']; // id
$im=$row['im']; // imie i nazwisko
$mecze=$row['mecze']; // ilosc meczy
$minuty=$row['minuty']; // minuty na boisku
$bramki1=$row['bramki1']; // bramki w sumie
$trafienia1=$row['trafienia1']; // bramki między 1 a 15 min.
$trafienia2=$row['trafienia2']; // bramki między 16 a 30 min.
$trafienia3=$row['trafienia3']; // bramki między 31 a 45 min.
$trafienia4=$row['trafienia4']; // bramki między 46 a 60 min.
$trafienia5=$row['trafienia5']; // bramki między 61 a 75 min.
$trafienia6=$row['trafienia6']; // bramki między 76 a 90 min.
?>[/php:1:b2d0b2a694]


Chodzi mi o to zeby w sumie te % nie przekraczały 100%, tzn zeby 100% rozbiło sie na te poszczególne procenty
adwol
Cytat
[php:1:27c10e19bf]<?php
$sql = mysql_query("SELECT * FROM pilkarze ORDER BY id_pilkarza");

while($row = mysql_fetch_array($sql))
{
$id=$row['id']; // id
$im=$row['im']; // imie i nazwisko
$mecze=$row['mecze']; // ilosc meczy
$minuty=$row['minuty']; // minuty na boisku
$bramki1=$row['bramki1']; // bramki w sumie
$trafienia1=$row['trafienia1']; // bramki między 1 a 15 min.
$trafienia2=$row['trafienia2']; // bramki między 16 a 30 min.
$trafienia3=$row['trafienia3']; // bramki między 31 a 45 min.
$trafienia4=$row['trafienia4']; // bramki między 46 a 60 min.
$trafienia5=$row['trafienia5']; // bramki między 61 a 75 min.
$trafienia6=$row['trafienia6']; // bramki między 76 a 90 min.
?>[/php:1:27c10e19bf]
Chodzi mi o to zeby w sumie te % nie przekraczały 100%, tzn zeby 100% rozbiło sie na te poszczególne procenty

Hmm, ten kod co tu podałeś tylko wyciąga już gotowe dane, a myślę, że sprawdzanie spójności powinno się odbywać na etapie wkładania ich do bazy. Spróbuj przy ustalaniu zawartości każdego z pól trafienia[1-6] zaokrąglić round()'em wartość procentową. Wtedy suma powinna dać 100%, bo round konsekwentnie w niektórych obetnie końcówkę a w niektórych doda do pełnego procenta.
Kinool
hmm ja bym zrobil tak:

zlczasz ilosc wszystkich bramek (powiedzmy ze jest ich wszystkich 8 )

teraz $procent=100/8; i wychodzi ile 1 bramka to jaki procent

potem musisz obliczyc dal kazdego przedzialu czasowego ile procent bramek zostalo trafionych

$wynik=$ilosc_bramek_w_przedziale_czasowy*$procent;

czyli jezle w czasi 1-15 byla 1 bramka to $wynik=1*$procent; co powinno
dac 12,5%

jesli byly by powidzmy 3 bramki w danym okresie to procent by wynosil 37,5%
matt
Nie wiem czy dobrze, ale dorobiłem takie cos:
[php:1:c5089b5f65]<?php
$dodawanie= $trafienia1 + $trafienia2 + $trafienia3 + $trafienia4 + $trafienia5 + $trafienia6;
$procent= 100/$dodawanie;
$przedzial1 = $trafienia1 * $procent;
$przedzial2 = $trafienia2 * $procent;
$przedzial3 = $trafienia3 * $procent;
$przedzial4 = $trafienia4 * $procent;
$przedzial5 = $trafienia5 * $procent;
$przedzial6 = $trafienia6 * $procent;
?>[/php:1:c5089b5f65]

i juz jak by dobrze ale w sumie calosc procentow wynos 97, tylko wyniki wychodza takie: 15.254237288136 13.559322033898 11.864406779661 10.169491525424 15.254237288136 33.898305084746
może by przy wynikach zastosować funkcje [manual:c5089b5f65]round()[/manual:c5089b5f65] ?
Kinool
moza uzyc round() do zaokraglania alebo wordwrap() do obcinania np do 2 miejsc po przecinku
matt
Nadal cos nie tak, dlatego zamowilem sobie dzis ksiazke PHP4. Zaawansowane programowanie moze w niej znajde odpowiedz laugh.gif :?
Kinool
ksiazka to doby pomysl ale wordwrap() powinno dzialac (sam tak obcinam wyniki)

zrob tak:

$wynik=10.1879990098; // zalozy ze jest to twoja liczba jaka uzyskalez z dzielenia

$wynik=wordwrap(4, $wynik); // efektem tego powinna byc 10.1

nie jest to najlepsza metoda bo jesli wynik bedzi 8.8387432934 to wynikiem bedzie 8.83 czyli w jednym przypadku bedzie jedno miejsce po przecinku a w drugim 2 liczby po przecinku

ale zna to latwo rozwiaza poprzez sprawdzenie czy liczba jest wieksza od 10

czyli:

if ($wynik>10)
$wynik=wordwrap(5, $wynik);
else
$wynik=wordwrap(4, $wynik);

to powinno zalatwic sprawe i wynik wynik powonien byc zawsze obcinany do 2 miejsc po przecinku
cahe
A ja bym to zrobił troszkę inaczej... a mianowicie:

1. Zsumował wszystko.

2. Obliczył procenty dla wszystkich czasów prócz ostatniego.

3. Zaokroąglił bez przecinków.

3. Zsumował wszystkie procenty

4. Jako wartość ostatniego czasu dał bym $wynik_ostatni_czas = 100 - $suma_procent.

Dlaczego? Bo po zaokrągleniach może się nie zgadzać wynik - np. nie być równy 100%, ale np. 101%.
Kinool
do obcinania stringa czyli w twoim przypadku do zmniejszenia np do 2 miejsc po przecinku dobra jest funkcja substr()

np.

$tekst=substr($tekst,0,4);

czyli obcina string z $tekst zaczynajac od 0 do 4

moze to bedzie ci dzialac[/b]
FiDO
juz lepsze bedzie cos z tego:
[php:1:b25ab642c2]
/* 1 */
$wynik = round($liczba,2);
/* 2 */
$wynik = floor(100 * $liczba) / 100;
/* 3 */
$wynik = sprintf("%.2f", $liczba);
[/php:1:b25ab642c2]

Uzycie wordwrap do zaokraglania lekko mnie rozbawilo przyznam winksmiley.jpg
Kinool
wordwrap() pomylilo mi sie z substr()

a to i tak nie mialo sluzyc do zaokraglania tylko do obciecia!
FiDO
Drugi ze sposobow podanych przeze mnie tez tylko obcina, bez zaokraglania. substr jest malo uniwersalny, bo przy innym wymiarze liczby juz musial bys zmodyfikowac granice wycinania.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.