Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Procenty
matt
post 12.08.2003, 23:31:04
Post #1





Grupa: Zarejestrowani
Postów: 82
Pomógł: 0
Dołączył: 12.08.2003
Skąd: Kalisz

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
adwol
post 13.08.2003, 00:00:49
Post #2





Grupa: Zarejestrowani
Postów: 691
Pomógł: 0
Dołączył: 6.08.2003

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Kinool
post 13.08.2003, 06:45:19
Post #3





Grupa: Zarejestrowani
Postów: 560
Pomógł: 0
Dołączył: 15.07.2003
Skąd: Kwidzyn

Ostrzeżenie: (0%)
-----


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%
Go to the top of the page
+Quote Post
matt
post 13.08.2003, 12:26:26
Post #4





Grupa: Zarejestrowani
Postów: 82
Pomógł: 0
Dołączył: 12.08.2003
Skąd: Kalisz

Ostrzeżenie: (0%)
-----


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] ?
Go to the top of the page
+Quote Post
Kinool
post 13.08.2003, 12:46:20
Post #5





Grupa: Zarejestrowani
Postów: 560
Pomógł: 0
Dołączył: 15.07.2003
Skąd: Kwidzyn

Ostrzeżenie: (0%)
-----


moza uzyc round() do zaokraglania alebo wordwrap() do obcinania np do 2 miejsc po przecinku
Go to the top of the page
+Quote Post
matt
post 13.08.2003, 13:06:21
Post #6





Grupa: Zarejestrowani
Postów: 82
Pomógł: 0
Dołączył: 12.08.2003
Skąd: Kalisz

Ostrzeżenie: (0%)
-----


Nadal cos nie tak, dlatego zamowilem sobie dzis ksiazke PHP4. Zaawansowane programowanie moze w niej znajde odpowiedz laugh.gif :?
Go to the top of the page
+Quote Post
Kinool
post 13.08.2003, 13:24:11
Post #7





Grupa: Zarejestrowani
Postów: 560
Pomógł: 0
Dołączył: 15.07.2003
Skąd: Kwidzyn

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
cahe
post 13.08.2003, 16:53:43
Post #8





Grupa: Zarejestrowani
Postów: 223
Pomógł: 0
Dołączył: 22.03.2003

Ostrzeżenie: (0%)
-----


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%.
Go to the top of the page
+Quote Post
Kinool
post 13.08.2003, 23:24:58
Post #9





Grupa: Zarejestrowani
Postów: 560
Pomógł: 0
Dołączył: 15.07.2003
Skąd: Kwidzyn

Ostrzeżenie: (0%)
-----


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]
Go to the top of the page
+Quote Post
FiDO
post 14.08.2003, 09:06:55
Post #10





Grupa: Przyjaciele php.pl
Postów: 1 717
Pomógł: 0
Dołączył: 12.06.2002
Skąd: Wolsztyn..... Studia: Zielona Góra

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Kinool
post 14.08.2003, 09:22:10
Post #11





Grupa: Zarejestrowani
Postów: 560
Pomógł: 0
Dołączył: 15.07.2003
Skąd: Kwidzyn

Ostrzeżenie: (0%)
-----


wordwrap() pomylilo mi sie z substr()

a to i tak nie mialo sluzyc do zaokraglania tylko do obciecia!
Go to the top of the page
+Quote Post
FiDO
post 14.08.2003, 10:01:27
Post #12





Grupa: Przyjaciele php.pl
Postów: 1 717
Pomógł: 0
Dołączył: 12.06.2002
Skąd: Wolsztyn..... Studia: Zielona Góra

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 5.08.2025 - 09:35