Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [js] dynamiczne grupowanie danych
Forum PHP.pl > Forum > Po stronie przeglądarki
yarek12
Witam,
Mam 3 inputy text (t_n) i 3 inputy text (r_n)

  1. <input type="text" name="t_1"><input type="text" name="r_1">
  2. <input type="text" name="t_2"><input type="text" name="r_2">
  3. <input type="text" name="t_3"><input type="text" name="r_3">


Przykładowo wpisuje do t_1, t_2 i t_3 wartość 1, i teraz to r_1 wpisuje "dom", do r_2 też "dom", a do r_3 "trawa".

Przy użyciu tych danych chciałbym otrzymać 2 (jako suma wartości gdzie r_n wynosi "dom") i 1 (jako suma wartości gdzie r_n wynosi "trawa").

Prościej mówiąc potrzebuję sumować wartośći t_1 gdzie r_n jest takie same.


Jakieś pomysły?? Sam myślę żeby to zrobić na array, i pogrupować do tabeli - niestety nie mam pomysłu na strukturę tabeli i dodawanie.


Przypominam, że cały skrypt musi działać dynamicznie (bez odświeżania strony).


Z góry dziękuje za pomoc.
wookieb
Wrzuć dane do tablicy i... http://phpjs.org/functions/array_count_values:308
yarek12
Hmmm, funkcja array_count_values(); na pewno mi pomoże, jednak on zlicza ile jest w tabeli danych o podanej nazwie.

  1. <?php
  2. $array = array(1, "hello", 1, "world", "hello");
  3. $count = array_count_values($array);
  4. echo $count['hello'];
  5. ?>


W takim wypadku echo zwróci 2, ponieważ w tej tabeli są dwa "hello".
Możliwe, że źle wykorzystałem twoją poradę, proszę o małe wyjaśnienie, jak to wykorzystać w moim przypadku, kiedy potrzebuje zsumować wszystkie wartości t_n gdzie r_n jest takie samo (patrz 1 post).

wookieb
Twoja tablica
[JAVASCRIPT] pobierz, plaintext
  1. var tab = ['wartosc_t_1_wartosc_r_1', 'wartosc_t_2_wartosc_r_2']; // itd
[JAVASCRIPT] pobierz, plaintext
yarek12
Czy w takim wypadku funkcja nie podliczy mi ponownie ile jest takich samych wartości??
Dalej nie wiem jak to wykorzystać, ta funkcja zlicza wartości o tej samej nazwie, może się źle zrozumieliśmy.

Ja potrzebuję dodać do siebie wartości t_n gdzie r_n jest takie same.
wookieb
Wybacz nie zrozumiałem Cię :/
No to niestety trzeba się bawić.
[JAVASCRIPT] pobierz, plaintext
  1. var t, r, combineValue;
  2. var countArray = [];
  3. for (var i =1; i<=n; i++) {
  4. t = document.getElementById('t_'+i);
  5. r = document.getElementById('r_'+i);
  6. if (t === r) {
  7. combineValue = t+'_'+r;
  8. if (!countArray[combineValue]) {
  9. countArray[combineValue] = 1;
  10. } else {
  11. countArray[combineValue]++;
  12. }
  13. }
  14. }
[JAVASCRIPT] pobierz, plaintext
yarek12
wywala null, albo undefinde
wookieb
Aj. poprawiam
[JAVASCRIPT] pobierz, plaintext
  1. Wybacz nie zrozumiałem Cię :/
  2. No to niestety trzeba się bawić.
  3. [javascript]
  4. var t, r, combineValue;
  5. var countArray = [];
  6. for (var i =1; i<=n; i++) {
  7. t = document.getElementById('t_'+i).value;
  8. r = document.getElementById('r_'+i).value;
  9. if (t === r) {
  10. combineValue = t+'_'+r;
  11. if (!countArray[combineValue]) {
  12. countArray[combineValue] = 1;
  13. } else {
  14. countArray[combineValue]++;
  15. }
  16. }
  17. }
[JAVASCRIPT] pobierz, plaintext

Ale to już mogłeś sam doszukać.
Oczywiście "n" musisz zdefiniować ....
yarek12
  1. <script type="text/javascript">
  2. var t, r, combineValue;
  3. var countArray = [];
  4. var n = 3;
  5. for (var i =1; i<=n; i++) {
  6. t = document.getElementById('t_'+i).value;
  7. r = document.getElementById('r_'+i).value;
  8. if (t === r) {
  9. combineValue = t+'_'+r;
  10. if (!countArray[combineValue]) {
  11. countArray[combineValue] = 1;
  12. } else {
  13. countArray[combineValue]++;
  14. }
  15. }
  16. }
  17. <input type="text" value="3" id="t_1"><input type="text" value="dom" id="r_1"><br />
  18. <input type="text" value="2" id="t_2"><input type="text" value="dom" id="r_2"><br />
  19. <input type="text" value="1" id="t_3"><input type="text" value="lato" id="r_3">


.value zauważyłem, jednka mimo tego zwraca null
wookieb
Bo.. nie ma pól z grupy t i r o tych samych wartościach. Poza tym "kto, co" zwraca?
yarek12
Alert ma zwracać, no jednak teraz też nie do końca się zrozumieliśmy.

On nie szuka takich samych t_n i r_n

Tylko sumuje wartości t_n gdzie r_n są takie same.

np.:

  1. <input type="text" id="t_1" value="2"><input type="text" id="r_1" value="dom">
  2. <input type="text" id="t_2" value="5"><input type="text" id="r_2" value="dom">
  3. <input type="text" id="t_3" value="6"><input type="text" id="r_3" value="lato">



Przy takim kodzie, wartość dom wynosiła by 7 (5+2), a lato 6

Właśnie o taki skrypt mi chodzi.
wookieb
Trzeba było ten przykład walić na początku...
[JAVASCRIPT] pobierz, plaintext
  1. var t, r;
  2. var countArray = [];
  3. var n = 3;
  4. for (var i =1; i<=n; i++) {
  5. t = Number(document.getElementById('t_'+i).value);
  6. r = document.getElementById('r_'+i).value;
  7. if (!countArray[r]) {
  8. countArray[r] = t;
  9. } else {
  10. countArray[r] += t;
  11. }
  12. }
[JAVASCRIPT] pobierz, plaintext
yarek12
Hmmm, nie mogę wytestować, nie wiem dlaczego document.write(); nie działa po pętli for i nie mogę wyświetlić tabeli.


  1. <script type="text/javascript">
  2. var t, r;
  3. var countArray = [];
  4. var n = 1;
  5. for (var i =1; i<=n; i++) {
  6. t = Number(document.getElementById('t_'+i).value);
  7. r = document.getElementById('r_'+i).value;
  8. if (!countArray[r]) {
  9. countArray[r] = t;
  10. } else {
  11. countArray[r] += t;
  12. }
  13. }
  14. var arr = countArray[r];
  15. document.write(arr);

wookieb
firebug i console.log (frazy dla google)
Poza tym wstawisz kod PRZED wystąpieniem tych elementów, a powinieneć PO. Podstawy JavaScriptu.
yarek12
Wpisuje tylko ostatnią wartość do countArray, a nie sumuje.
  1. <input type="text" value="2" id="t_1"><input type="text" value="dom" id="r_1"><br />
  2. <input type="text" value="2" id="t_2"><input type="text" value="dom" id="r_2"><br />
  3. <input type="text" value="5" id="t_3"><input type="text" value="lato" id="r_3">
  4. <div id="test">-</div>
  5.  
  6. <script type="text/javascript">
  7. var t, r;
  8. var countArray = [];
  9. var n = 3;
  10. for (var i =1; i<=n; i++) {
  11. t = Number(document.getElementById('t_'+i).value);
  12. r = document.getElementById('r_'+i).value;
  13. if (!countArray[r]) {
  14. countArray[r] = t;
  15. } else {
  16. countArray[r] += t;
  17. }
  18. }
  19. var arr = countArray[r];
  20. document.getElementById("test").innerHTML = arr;
  21. </script>
wookieb
A mówiłem "console.log" i nie "arr" tylko countArray
yarek12
Możesz usunąć temat, chyba nie dojdziemy do porozumienia

W takim razie proszę moderatora, o wyczyszczenie tego tematu, aby został tylko wątek główny
wookieb
Przestań się rzucać. Dostałeś jasne wskazówki. Co z tego, że zostanie watek główny jak dojdziemy/ecie do tego samego punktu kulminacyjnego o nazwie "ja i tak was nie posłucham". Temat zostaje.
W myśl starej mądrości: 'Nie można coś widzieć a potem odwidzieć'.
yarek12
Nie chce być upierdliwy, ale nie do końca rozumiesz moją wizje skryptu.

Skrypt który napisałeś tylko zsumuje wartości t, do tabeli.

Ja ciągle mówie o sumowaniu wartości t_1 gdzie r_1 jest takie same.

Podaje jasne wytłumaczenie:

  1. <input type="text" id="t_1" value="5"><input type="text" id="r_1" value="dom">
  2. <input type="text" id="t_2" value="8"><input type="text" id="r_2" value="dom">
  3. <input type="text" id="t_3" value="2"><input type="text" id="r_3" value="las">
  4. <input type="text" id="t_4" value="6"><input type="text" id="r_4" value="las">
  5. <input type="text" id="t_5" value="7"><input type="text" id="r_5" value="las">
  6. <input type="text" id="t_6" value="1"><input type="text" id="r_6" value="basen">


W efekcie, potrzebuje otrzymać: Dom: 13 (5+8), Las: oraz 15 (7+6+2), oraz Basen: 1.

Jeśli ktoś ma pomysł na napisanie takiego skryptu, to proszę porady.
Staram się to wytłumaczyć najbardziej jak mogę, i myślę, że dobrze przedstawiłem sposób działania.

____________________________________

Ok, mam teraz taką tablice, id numerowane jest po kolei:

$mat[rodzaj][id] = wartość;


i potrzebuję zsumować wartości z tablic gdzie rodzaj jest taki sam.
wookieb
[JAVASCRIPT] pobierz, plaintext
  1. var t, r;
  2. var countObj = {};
  3. var n = 6;
  4. for (var i =1; i<=n; i++) {
  5. t = Number(document.getElementById('t_'+i).value);
  6. r = document.getElementById('r_'+i).value;
  7. if (!countObj[r]) {
  8. countObj[r] = {
  9. occurTimes: 1,
  10. sum: t
  11. };
  12. } else {
  13. countObj[r].occurTimes++;
  14. countObj[r].sum += t;
  15. }
  16. }
  17.  
  18. // przefiltrowanie
  19. for (i in countObj) {
  20. if (countObj[i].occurTimes === 1) {
  21. delete countObj[i];
  22. } else {
  23. // tutaj robisz co chcesz z wynikiem
  24. }
  25. }
  26.  
  27. // wynik
  28. countObj['dom'].occurTimes // ilosc ywstaw
  29. countObj['dom'].sum // suma z nich
[JAVASCRIPT] pobierz, plaintext
yarek12
Dzięki bardzo pomogłeś, teraz ten sam skrypt potrzebowałem jeszcze w php, z czym nie było problemu. Wszystko pięknie działa.
Dzięki Wookieb za wytrwałość tongue.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.