Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Sumowanie/Wyliczanie średniej
Forum PHP.pl > Forum > Przedszkole
kamioool
A więc od przez pare ostatnich dni walcze z jednym skryptem ktory ma za zadanie - z logow gry - wplat do klanu - wyliczyć srednią dla każdego wpłacającego.

Dane otrzymuje w takiej postaci:

Cytat
[2014-02-15 17:21:52] Tomek123 742 521 250 zł
[2014-02-15 10:37:34] Kamil 200 000 000 zł
[2014-02-14 20:03:58] Janek12 200 000 000 zł
[2014-02-14 16:20:16] Bartek 237 606 800 zł
[2014-02-14 16:19:36] Kamil 200 000 000 zł
[2014-02-14 10:31:36] Don Vito 000 000 zł
[2014-02-14 08:31:07] Don Vito 623 717 850 zł
[2014-02-11 13:30:53] Bartek 1 379 187 686 zł


Po długiej walce udało stworzyć mi sie taki kod: efekt można zobaczyc na stronie "http://lobots.no-ip.pl/"

  1. <?php
  2.  
  3. if (isset ($_POST['form'])) {
  4. $textInput = $_POST['form'];
  5. $array = explode("\n", $textInput);
  6. $i = 0;
  7.  
  8.  
  9. foreach ($array as $v) {
  10. $elementy = explode(" ", $v);
  11. $i++;
  12. $tmpcount = count($elementy);
  13. $temp_nick = '';
  14. $temp_kwota = '';
  15. for ($i = 2; $i < $tmpcount; $i++) {
  16.  
  17.  
  18. if (trim($elementy[$i]) !== "zł" ) {
  19. if(is_numeric( $elementy[$i]) && (strlen($elementy[$i]) <= 3) ) {
  20. $temp_kwota .= $elementy[$i].'';
  21. }
  22. else {
  23. $temp_nick .= $elementy[$i].' ';
  24. }
  25. }
  26. }
  27. echo $temp_nick, $temp_kwota ." <BR />";
  28. }
  29.  
  30. echo "<br> Załadowano " . count($array) . " rekordów";
  31. }
  32.  
  33.  
  34. ?>


Po wklejeniu wcześniej podanych danych otrzymuje taki efekt:
Cytat
Tomek123 742521250
Kamil 200000000
Janek12 200000000
Bartek 237606800
Kamil 200000000
Don Vito 000000
Don Vito 623717850
Bartek 1379187686

Załadowano 9 rekordów


Chciał bym podać końcowe zestawienie tzn. zsumować wpłaty dla wszystkich ktorych imiona sie powtarzają. Nie za bardzo wiem w jaki sposob przechowywac dane aby moc na nich pozniej spokojnie operować. Jako że jestem troszke oporny w szybkim przyswajaniu nowej wiedzy proszę o przykłady.
nospor
Dane zapisuj do tablicy


Na samym poczatku kodu daj:
$users = array();

Zas zamiast tego
echo $temp_nick, $temp_kwota ." <BR />";
dodaj kod
  1. if (!isset($users[$temp_nick])) {
  2. $users[$temp_nick] = array();
  3. }
  4. $users[$temp_nick][] = $temp_kwota;

Ten kod stworzy ci tablice.

Zrob sobie
print_r($users);
na koncu a zobaczysz jak wyglada ta tablica. Mozesz wowczas bez problemu sumowac czy co tam ci sie zywnie podoba
kamioool
Rozumiem stworzyłeś tu tablice wielowymiarową z indeksem jako nazwa uzytkownika.

Czy może prościej było by zapisywać informacje do bazy danych. Chcial bym upublicznic skrypt jednak boje sie że korzystanie z mysql bez odpowiedniej walidacji danych moze narazic mnie na niebezpieczenstwo.
nospor
A po co zapisywac ci to do bazy, skoro chcesz wyliczac dane na biezącą?
No chyba ze zamierzasz trzymac te dane na dluzej, to tak, mozesz pisac do bazy.
kamioool
Cytat(nospor @ 24.02.2014, 13:59:06 ) *
A po co zapisywac ci to do bazy, skoro chcesz wyliczac dane na biezącą?
No chyba ze zamierzasz trzymac te dane na dluzej, to tak, mozesz pisac do bazy.


Jednak sie na tym klade - tablice wielowymiarowe to zbyt szybko dla mnie ;/
Mogł byś jeszcze pomóć w jaki sposob zsumować te dane? i wyświetlic "$nick wpłacił $suma"

Nie wiem w jaki sposob odnieść sie masowo do tych tablic skoro indeksem nie moze byc $i++ ;/
nospor
Cytat
Nie wiem w jaki sposob odnieść sie masowo do tych tablic skoro indeksem nie moze byc $i++ ;/
Do latania po tablicach uzywa sie FOREACH - wowczas zadne $i ci niepotrzebne
kamioool
Cytat(nospor @ 24.02.2014, 15:04:34 ) *
Do latania po tablicach uzywa sie FOREACH - wowczas zadne $i ci niepotrzebne


Czyli dla tablicy dwuwymiarowej musze uzyc petli foreach w petli foreach? snitch.gif
nospor
Ogolnie tak.
Ale w tym wypadku wystarczy tylko jedno FOREACH by przeleciec po nickach, a potem to juz tylko array_sum itp.
kamioool
A aby posortować po sumie wpłat? Prawdopodobnie musiał bym utworzyc kolejna tablice gdzie zapisywał bym juz zsumowane wpłaty i wtedy sortowanie było by proste
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.