Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][XML] Sumowanie pól z xml?
Forum PHP.pl > Forum > Przedszkole
agapikok
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ę
nospor
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?
agapikok
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.
k_@_m_i_l
  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.  
agapikok
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.
k_@_m_i_l
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ć.
nospor
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
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.