Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [js] dynamiczne grupowanie danych
yarek12
post 9.06.2011, 11:41:51
Post #1





Grupa: Zarejestrowani
Postów: 127
Pomógł: 0
Dołączył: 5.08.2010

Ostrzeżenie: (10%)
X----


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.
Go to the top of the page
+Quote Post
wookieb
post 9.06.2011, 11:45:41
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Wrzuć dane do tablicy i... http://phpjs.org/functions/array_count_values:308


--------------------
Go to the top of the page
+Quote Post
yarek12
post 9.06.2011, 12:09:12
Post #3





Grupa: Zarejestrowani
Postów: 127
Pomógł: 0
Dołączył: 5.08.2010

Ostrzeżenie: (10%)
X----


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).

Go to the top of the page
+Quote Post
wookieb
post 9.06.2011, 12:11:37
Post #4





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Twoja tablica
[JAVASCRIPT] pobierz, plaintext
  1. var tab = ['wartosc_t_1_wartosc_r_1', 'wartosc_t_2_wartosc_r_2']; // itd
[JAVASCRIPT] pobierz, plaintext


--------------------
Go to the top of the page
+Quote Post
yarek12
post 9.06.2011, 12:17:03
Post #5





Grupa: Zarejestrowani
Postów: 127
Pomógł: 0
Dołączył: 5.08.2010

Ostrzeżenie: (10%)
X----


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.
Go to the top of the page
+Quote Post
wookieb
post 9.06.2011, 12:26:11
Post #6





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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


--------------------
Go to the top of the page
+Quote Post
yarek12
post 9.06.2011, 12:32:24
Post #7





Grupa: Zarejestrowani
Postów: 127
Pomógł: 0
Dołączył: 5.08.2010

Ostrzeżenie: (10%)
X----


wywala null, albo undefinde
Go to the top of the page
+Quote Post
wookieb
post 9.06.2011, 12:36:02
Post #8





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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ć ....


--------------------
Go to the top of the page
+Quote Post
yarek12
post 9.06.2011, 12:41:37
Post #9





Grupa: Zarejestrowani
Postów: 127
Pomógł: 0
Dołączył: 5.08.2010

Ostrzeżenie: (10%)
X----


  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
Go to the top of the page
+Quote Post
wookieb
post 9.06.2011, 12:44:59
Post #10





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Bo.. nie ma pól z grupy t i r o tych samych wartościach. Poza tym "kto, co" zwraca?


--------------------
Go to the top of the page
+Quote Post
yarek12
post 9.06.2011, 12:51:23
Post #11





Grupa: Zarejestrowani
Postów: 127
Pomógł: 0
Dołączył: 5.08.2010

Ostrzeżenie: (10%)
X----


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.

Ten post edytował yarek12 9.06.2011, 12:52:07
Go to the top of the page
+Quote Post
wookieb
post 9.06.2011, 13:00:30
Post #12





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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
Powód edycji: [wookieb]:


--------------------
Go to the top of the page
+Quote Post
yarek12
post 9.06.2011, 13:08:24
Post #13





Grupa: Zarejestrowani
Postów: 127
Pomógł: 0
Dołączył: 5.08.2010

Ostrzeżenie: (10%)
X----


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);

Go to the top of the page
+Quote Post
wookieb
post 9.06.2011, 13:10:10
Post #14





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




firebug i console.log (frazy dla google)
Poza tym wstawisz kod PRZED wystąpieniem tych elementów, a powinieneć PO. Podstawy JavaScriptu.


--------------------
Go to the top of the page
+Quote Post
yarek12
post 9.06.2011, 13:16:51
Post #15





Grupa: Zarejestrowani
Postów: 127
Pomógł: 0
Dołączył: 5.08.2010

Ostrzeżenie: (10%)
X----


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>
Powód edycji: [wookieb]: [wookieb]:
Go to the top of the page
+Quote Post
wookieb
post 9.06.2011, 13:20:25
Post #16





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




A mówiłem "console.log" i nie "arr" tylko countArray
Powód edycji: [wookieb]:


--------------------
Go to the top of the page
+Quote Post
yarek12
post 9.06.2011, 14:45:09
Post #17





Grupa: Zarejestrowani
Postów: 127
Pomógł: 0
Dołączył: 5.08.2010

Ostrzeżenie: (10%)
X----


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
Go to the top of the page
+Quote Post
wookieb
post 9.06.2011, 14:50:16
Post #18





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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ć'.


--------------------
Go to the top of the page
+Quote Post
yarek12
post 9.06.2011, 17:19:37
Post #19





Grupa: Zarejestrowani
Postów: 127
Pomógł: 0
Dołączył: 5.08.2010

Ostrzeżenie: (10%)
X----


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.

Ten post edytował yarek12 9.06.2011, 16:42:56
Go to the top of the page
+Quote Post
wookieb
post 9.06.2011, 20:36:33
Post #20





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




[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


--------------------
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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 - 14:53