Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][XML] Sumowanie pól z xml?
agapikok
post 14.05.2012, 07:39:03
Post #1





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 30.06.2011

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


Cześć jestem początkująca i mam problem z sumowaniem pól w xml. Szukałam w google o sumowaniu ale nigdzie nie wyskoczyło mi info, prosze nakierujcie mnie na stronę, albo podpowiedcie.

mam skrypt odczytujący plik xml

  1. $data = simplexml_load_file('PLIK.XML');
  2. $temp = array();
  3.  
  4. foreach($data->pola->item as $item) {
  5. $temp[(string) $item['SYM']] = array('IL_KUP' => (string) $item['IL_KUP'],
  6. 'KUP_ZA' => (string) $item['KUP_ZA'],
  7. 'IL_SPR' => (string) $item['IL_SPR'],
  8. 'SPR_ZA' => (string) $item['SPR_ZA'],
  9. 'ZYSK' => (string) $item['ZYSK'],
  10. 'OPIS' => (string) $item['OPIS']);
  11. // generowanie danych do tabeli
  12. echo '<tr>
  13. <td>'.$item['SYM'].'</td>
  14. <td>'.$item['IL_KUP'].'</td>
  15. <td>'.$item['KUP_ZA'].'</td>
  16. <td>'.$item['IL_SPR'].'</td>
  17. <td>'.$item['SPR_ZA'].'</td>
  18. <td>'.$item['ZYSK'].'</td>
  19. <td>'.$item['OPIS'].'</td>
  20. </tr>';
  21. // pola sumujące
  22. echo '<tr>
  23. <td></td>
  24. <td>suma -> '.$item['IL_KUP'].'</td>
  25. <td>suma -> '.$item['KUP_ZA'].'</td>
  26. <td>suma -> '.$item['IL_SPR'].'</td>
  27. <td>suma -> '.$item['SPR_ZA'].'</td>
  28. <td>suma -> '.$item['ZYSK'].'</td>
  29. <td></td>
  30. </tr>';
  31. }
  32.  
  33.  
  34. echo '</table>';


chcę aby mi pod spodm w tabeli zsumowało np wszystkie pola $item['IL_KUP'] i wyrzuciło pod spodem tam gdzie jest suma ->

o ile sumowac pola w jednym wyrzucie to nie problem bo robię $item['IL_KUP'] * $item['KUP_ZA'] czy jakieś inne wartości nawet liczbowe i mam dobry wynik, ale sumowanie np jednej wartości stwarza mi problem, nie wiem czy muszę zamknąć pętlę tablicy i do samego sumowania zrobić jeszcze jedną, czy w tej samej co sa dane da się to zrobić?

--- Edytowano ---
Próbowałam na własne sposoby i wiele innych jakie mi przyszły do głowy.. pewnie to dla większości pikuś jest jak wszystko co człowiek już umie smile.gif
  1. echo '<tr>
  2. <td></td>';
  3. $il_kup = $item['IL_KUP'];
  4. foreach($data->pola>item as $item) {
  5. $temp = array('IL_KUP' => (string) $item['IL_KUP']);
  6. echo '<td>'.$il_kup.'</td>';
  7. $il_kup++;
  8. }


halo, czy nikt nie wie jak to zrobić, czy też się nie da? Proszę chociaż o takie info bo już jestem w stanie samobija ;/, albo chociaż jaki wers wpisać w google aby po angielskich stronach to znaleźć? Proszę

Ten post edytował agapikok 11.05.2012, 10:00:18
Go to the top of the page
+Quote Post
nospor
post 14.05.2012, 08:17:06
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Czytałem twój temat parę dni temu czytam i teraz. Zarówno wtedy jak iteraz nie mam bladego pojęcia w czym masz problem. Chcesz sumować? To sumuj, nikt ci nie broni. W czym problem?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
agapikok
post 14.05.2012, 13:48:47
Post #3





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 30.06.2011

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


właśnie w tym że może dla większości doświadczonych, bądź już wprawionych osób jest to żaden problem. Nie mam problemu z operacjami na jednym wyrzucie wyników np
  1. $item['IL_KUP'] + $item['KUP_ZA']
  2. //nawet
  3. $suma = $item['IL_KUP'] + $item['KUP_ZA']; //też nie jest problemem bo jest to jedna linia danych
  4.  
  5. //przy array_sum() w przykładzie poniżej wszystko działa, ale ja nie mam tak prostej jednowymiarowej tablicy
  6. $a = array(10, 3, 2, 12, 6);
  7. // oliczanie sumy
  8. $suma = array_sum($a);

A problem mój polega, że gdy mam 10 wpisów np $item['IL_KUP'] to nie mam pojęcia czy jest jakaś opcja typu array_sum($item['IL_KUP']) i mi sumuje te 10 linii tego wpisu, czy to trzeba zrobić na zasadzie tablicy która wurzuca każde 10 wyników i jeden po drugim dodaje?

teraz znalazłam taki przykład który sumuje np te same lata rekordu rok który jest w tablicy asocjacyjnej. Zaraz zamierzam przetestować taką opcję i spróbować coś podobnego wdrożyć u siebie, tylko zamiast rok np dam IL_KUP , a nóż trochę mi przy kombinowaniu poza cierpliwością doświadczenia z podstawami wpadnie...
  1. $array = Array(
  2. Array ( 'rok' => 1948, 'ilosc' => 3 ),
  3. Array ( 'rok' => 1949, 'ilosc' => 1 ),
  4. Array ( 'rok' => 1950, 'ilosc' => 3 ),
  5. Array ( 'rok' => 1950, 'ilosc' => 5 )
  6. );
  7. $buff = array();
  8. foreach ($array as $array2) {
  9. $apply = 0;
  10. for($i=0; $i < count($buff); $i++) {
  11. if($buff[$i]['rok'] == $array2['rok']) {
  12. $buff[$i]['ilosc'] += $array2['ilosc'];
  13. $apply = 1;
  14. }
  15. }
  16. if(!$apply) {
  17. $buff[] = $array2;
  18. }
  19. }
  20.  
  21. $array = $buff;
  22. unset($buff);

Czy dalej niezbyt jasno tłumaczę z jakimi podstawami mam problem? raz przełamane dadzą światopogląd, a wpisywanie w google sumowanie pól tablicy daje mi właśnie takie przypadki. Dlatego ewentualnie prosiłam o link do jakiegoś tutoriala od osoby bardziej rozeznanej.
Go to the top of the page
+Quote Post
k_@_m_i_l
post 14.05.2012, 14:04:27
Post #4





Grupa: Zarejestrowani
Postów: 349
Pomógł: 72
Dołączył: 22.01.2008
Skąd: Wadowice/Oświęcim

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


  1. $data = simplexml_load_file('PLIK.XML');
  2. $temp = array();
  3.  
  4. $il_kup = 0;
  5. $kup_za = 0;
  6. $il_spr = 0;
  7. $spr_za = 0;
  8. $zysk = 0;
  9.  
  10. foreach($data->pola->item as $item) {
  11. $temp[(string) $item['SYM']] = array('IL_KUP' => (string) $item['IL_KUP'],
  12. 'KUP_ZA' => (string) $item['KUP_ZA'],
  13. 'IL_SPR' => (string) $item['IL_SPR'],
  14. 'SPR_ZA' => (string) $item['SPR_ZA'],
  15. 'ZYSK' => (string) $item['ZYSK'],
  16. 'OPIS' => (string) $item['OPIS']);
  17.  
  18. // Dodajesz do zmiennej $il_kup liczbę, którą masz w "aktualnym wierszu ". I robisz tak z każdą zmienną, którą chcesz zsumować.
  19. $il_kup += (float)$item['IL_KUP'];
  20.  
  21. // generowanie danych do tabeli
  22. echo '<tr>
  23. <td>'.$item['SYM'].'</td>
  24. <td>'.$item['IL_KUP'].'</td>
  25. <td>'.$item['KUP_ZA'].'</td>
  26. <td>'.$item['IL_SPR'].'</td>
  27. <td>'.$item['SPR_ZA'].'</td>
  28. <td>'.$item['ZYSK'].'</td>
  29. <td>'.$item['OPIS'].'</td>
  30. </tr>';
  31.  
  32. }
  33. // pola sumujące
  34. echo '<tr>
  35. <td></td>
  36. <td>suma -> '.$il_kup.'</td>
  37. <td>suma -> '.$kup_za.'</td>
  38. <td>suma -> '.$il_spr.'</td>
  39. <td>suma -> '.$spr_za.'</td>
  40. <td>suma -> '.$zysk.'</td>
  41. <td></td>
  42. </tr>';
  43.  
  44. echo '</table>';
  45.  


--------------------
"PHP to człowiek. MySQL to również człowiek."
Go to the top of the page
+Quote Post
agapikok
post 19.05.2012, 09:40:25
Post #5





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 30.06.2011

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


Dziękuję Ci Kamilu, bardzo serdecznie :* Moim błędem było to iż uczę się ale pamięciowo wszystkiego nie ogarniam i akurat tego operatora += nie zapamiętałam, wiedzialam tylko że napewno coś w pętli musi być aby to zliczyć! Ogromnie jeszcze raz dziękuję dla Ciebie
Dla Ciebie nospor również podziękowania za prostowanie do pionu wink.gif Nie mniej jednak przychodzi mi na myśl diktum którego bardzo Ciekawy człowiek używał "Nie staraj się zostać człowiekiem sukcesu, lecz człowiekem wartościowym". I pomimo iż Twoja rada ani mi nie przysporzyła sukcesu, ani żadnej dodatniej wartości, wiem jednak jakim jesteś dobrym programistą i ilu osobom pomogłeś, a co za tym idzie jesteś wartościowy dla naszych początkujących mas, dlatego mój szacunek i podziw do Twojej osoby dalej zostaje na swoim miejscu, a więc wysoko! smile.gif

Mam jeszcze tylko takie pytanie, mianowicie natknęłam się na problem sumowania liczb sumowanej - masło maślane, już objaśniam smile.gif
  1. //Tak jak Kamil pokazał nad pętlą zmienne
  2. $stan = 0;
  3. $srednia = 0;
  4. //pętla z danymi
  5. foreach($data->dane->item as $item) {
  6. ....
  7. }
  8. //pod pętlą
  9. $stan = round((float)$item['STAN'], 2);
  10. $srednia = round((float)$item['SRED'], 2);
  11. $wartosc += ($srednia * $stan);
  12.  
  13. //i na innej stronie wyrzucam sobie wynik
  14. printf("%.02f", $wartosc);

Problemem jest to że jak się sumuje kalkulatorem wychodzi 558,48 a php sumuje na 557,93
próbowałam też usunąć "round((float)" i zostawić tylko $stan = $item['STAN']; ze stanu i średnia, aby mi nie zaokrąglało bo są liczby 00.00 jak i też 00.0000 więc myślałam że różnica wychodzi przez zbyt wczesne zaokrąglanie, ale wtedy wychodzą mi bzdury 419,00.
Go to the top of the page
+Quote Post
k_@_m_i_l
post 19.05.2012, 10:26:26
Post #6





Grupa: Zarejestrowani
Postów: 349
Pomógł: 72
Dołączył: 22.01.2008
Skąd: Wadowice/Oświęcim

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


A czy Twoje liczby w tym xml-u nie są czasem w postaci 14,15 ?
Jeśli tak, to przy (float)'14,15' php zwróci Ci 14. Więc musiałabyś zmienić wszystkie przecinki na kropki w liczbach (od razu mówię, że taką zmianę zrobisz funkcją: str_replace(',','.',$item['STAN']) ).
Najlepiej to pokaż fragment tego xmla, będzie łatwiej coś wywróżyć.

Ten post edytował k_@_m_i_l 19.05.2012, 10:30:56


--------------------
"PHP to człowiek. MySQL to również człowiek."
Go to the top of the page
+Quote Post
nospor
post 20.05.2012, 08:34:43
Post #7





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
i akurat tego operatora += nie zapamiętałam
Taki "myk" na przyszłość:
$zm = $zm + 4;
To też jest sumowanie i tu raczej skomplikowanych operatorów nie trzeba pamiętać wink.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

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: 14.08.2025 - 12:16