Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][XML] Sumowanie pól z xml?
agapikok
post
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 (IMG:style_emoticons/default/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
 
Start new topic
Odpowiedzi (1 - 6)
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 559
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?
Go to the top of the page
+Quote Post
agapikok
post
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
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.  
Go to the top of the page
+Quote Post
agapikok
post
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 (IMG:style_emoticons/default/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! (IMG:style_emoticons/default/smile.gif)

Mam jeszcze tylko takie pytanie, mianowicie natknęłam się na problem sumowania liczb sumowanej - masło maślane, już objaśniam (IMG:style_emoticons/default/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
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
Go to the top of the page
+Quote Post
nospor
post
Post #7





Grupa: Moderatorzy
Postów: 36 559
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ć (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 26.09.2025 - 10:34