Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [js] foreach - jak zastąpić
yarek12
post
Post #1





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

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


Każdemu znana pętla z php foreach wyświetla wszystkie elementy z tablicy (bez powtórzenia tych samych), której oczywiście nie ma w js.

Teraz mój problem:
Mam skrypt który tworzy mi tablice i sumuje takie same wyniki w pętli while, np.:

  1. mat = new Array();
  2. mat[1] += 0.5;
  3. mat[2] += 1.5;
  4. mat[1] += 2;


Jak każdy zauważył w tablicy powtarzają się (mat[1]), teraz potrzebuję skryptu który zwróci mi:

mat[1] = 2.5
mat[2] = 2;

Prościej mówiąc wyświetli wszystkie wyniki z bazy bez powtórzeń.
Jakieś pomysł?
Go to the top of the page
+Quote Post
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 19)
nospor
post
Post #2





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




Kod
for (var i in mat){
alert(i);
alert(mat[i]);
}


ps:
Cytat
foreach wyświetla wszystkie elementy z tablicy (bez powtórzenia tych samych)
Coś motasz. foreach nie ma nic do "bez powtórzeń". Foreach otrzymuje tablicę i po niej iteruje. Nie bawi się w żadne bezpowtarzanie - to co dostanie to przetworzy
Go to the top of the page
+Quote Post
yarek12
post
Post #3





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

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


Dobra, for, wyświetla mi tablicę, jednak nie mogę użyć =+ w tablicach - jak widać w pierwszym poście, ponieważ wtedy zwraca NaN, jak więc zsumować tablice o takich samych nazwach.
Go to the top of the page
+Quote Post
nospor
post
Post #4





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




Bo najpierw się przypisuje a potem dodaje. js jest bardziej restrykcyjne niż php.
Kod
mat = new Array();
mat[1] = 0.5;
mat[2] = 1.5;
mat[1] += 2;
Go to the top of the page
+Quote Post
yarek12
post
Post #5





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

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


hmm, o ty właśnie wiem. Tylko, że tablica mat powstaje w pętli i wykonuje się tyle razy ile jest inputów, jako pierwszą wartość w nawiasach bierze wartość selecta_1 a ostatnią wartość inputa_1.

O to chodzi, że cała tablica powstaje dynamicznie, więc jak sprawdzić czy dana wartość (ta w nawiasach) już wystąpiła, i jeśli wystąpiła to prze = dodać +(IMG:style_emoticons/default/questionmark.gif)
Go to the top of the page
+Quote Post
nospor
post
Post #6





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




Kod
Petla po i
if (typeof mat[i] == 'undefined')
    mat[i]=0;
mat[i] += wartosc;
koniec petli
Go to the top of the page
+Quote Post
yarek12
post
Post #7





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

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


"Pętla po i" - nie za bardzo rozumiem.

Czekaj, czyli ta instrukcja warunkowa ma być w pętli for wyświetlającą tablice, czy mojej while tworzącą tablicę.'
Jestem początkujący, dlatego proszę o wyrozumiałość i dokładniejsze tłumaczenie.
Go to the top of the page
+Quote Post
Pawel_W
post
Post #8





Grupa: Zarejestrowani
Postów: 1 675
Pomógł: 286
Dołączył: 15.06.2009
Skąd: Wieliczka

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


tworzącej
Go to the top of the page
+Quote Post
nospor
post
Post #9





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




Oczywiście, że tworzącej, co już wsponiał Paweł
Go to the top of the page
+Quote Post
yarek12
post
Post #10





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

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


Teraz chyba widzę problem, instrukcja warunkowa którą napisałeś chyba nie działa wedle moich oczekiwań, zobacz:

ja chcę zsumować talice gdzie i jest takie same, nie warość.

mat[1] = 0.5;
mat[2] = 0.5;
mat[1] = 0.5;


mat[i] = wartość.

Gdzie i jest takie same a nie wartość.
Go to the top of the page
+Quote Post
nospor
post
Post #11





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




Wszystko co podałem jest ok, tylko ty nie umiesz lub nie rozumiesz lub źle wstawiasz lub wszystko naraz

Pokaz lepiej kod, który to wszystko generuje bo do usranej śmierci możemy tak się bawić.
Go to the top of the page
+Quote Post
yarek12
post
Post #12





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

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


Dobra, za 20 min wrzucę kod jak będe w domu.
jeszcze raz dzięki za cierpliwość do mnie
Go to the top of the page
+Quote Post
nospor
post
Post #13





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




Cytat
jeszcze raz dzięki za cierpliwość do mnie
Niedługo wyczerpiesz limit abonamentowy a potem za każde słowo będziesz płacił 50zł więc uważaj (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
yarek12
post
Post #14





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

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


A więc tak html, kod jest dynamiczny, ale pokaże jeden z przekładów:

  1. <input type="hidden" value="3" name="all">
  2. <inpu type="text" name="t_1" value="0.5"><input type="text" name="r_1" value="dom">
  3. <inpu type="text" name="t_2" value="2"><input type="text" name="r_2" value="lato">
  4. <inpu type="text" name="t_3" value="1"><input type="text" name="r_3" value="dom">


Oto kod html, z którego chciałbym otrzymać dom: 1.5 (0.5 + 1) oraz lato: 2.

Teraz moje wcale nie działające js:

  1. var lp = parseInt(document.getElementById("all").value);
  2. var i = 1;
  3.  
  4. while (lp >= i) {
  5. if (typeof mat[i] == 'undefined') {
  6. mat[i]=0;
  7. }
  8. else {
  9. mat[i] += parseInt(document.getElementById("t_"+i).value);
  10. }
  11.  
  12. }
Go to the top of the page
+Quote Post
nospor
post
Post #15





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




Dobra, inaczej...
Pokaż kod, zanim zacząłeś robić zmiany. Przecież pętla co pokazałeś nie ma prawa działać, bo ani nie zmieniasz lp ani nie zmieniasz i. Pokaz kod jaki miałeś, bo coś czuję ze po zmianach zacząłęś kombinować jak koń pod górkę.
Go to the top of the page
+Quote Post
yarek12
post
Post #16





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

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


Masz rację w pętli którą tu wkleiłem brakuje:

i++;

Jednak to pierwsze co próbowałem, html, jest taki sam jak był od początku, używam go do kodu php którym wysyłam do mysql, teraz jednak potrzebuję jeszcze dynamicznie informować użytkownika dlatego muszę użyć js. nie mam nic wcześniej.

Jest tylko pętla która wykonuje się tyle razy ile jest t_n i r_n (przykład wyżej).
Teraz potrzebuję zsumować t_n gdzie r_n są takie same.
Go to the top of the page
+Quote Post
nospor
post
Post #17





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




Coś motasz kolego.
Jeśli i zwiększa w pętli, to nigdy w tej pętli nie będziesz miał sytuacji:
mat[1]
mat[2]
mat[1]
Nigdy.
Bedziesz miał sytuację:
mat[1]
mat[2]
mat[3]

Mówisz więc albo o różnych rzeczach albo już sam nie wiesz o czym mówisz. Nie chcę cię obrazic, nie mam takiego zamiaru. Zwracam ci delikatnie uwagę, że to co mówisz a to co pokazujesz nie trzyma się kupy.
Go to the top of the page
+Quote Post
yarek12
post
Post #18





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

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


Może źle zrozumiałeś, mat[*] *-w nawiasie jest wartość r_n czyli drugiego inputa.

Na przykłąd do r_2 wpiszesz kot, a do t_2 wpiszesz 3, to będzie: mat[kot] = 3.

A jeśli pojawi się kilka t_n gdzie r_n jest takie same to je zsumuje.
Go to the top of the page
+Quote Post
nospor
post
Post #19





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




Podałeś kod. Odniosłem się do tego kodu. Ten kod nigdy nie będzie miał tego co ci napisałem

mat[kot] = 3.
Jaki mat od kot? W pętli masz i które jest liczbą.
Mówisz o jednym, kod pokazujesz zupełnie inny.

Proszę poraz ostatni: pokaż kod jaki masz, a nie jakiś wirtualny który tworzysz na poczekaniu.
Jeśli zaś to jest kod, który masz to przestan wymyślać jakieś historyjki o 'kot', bo to ma się nijak do kodu, który pokazujesz.
Go to the top of the page
+Quote Post
yarek12
post
Post #20





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

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


Kod właśnie jest dobry, zmyliła cię pętla która właśnie jak napisałeś pisałem na poczekaniu, i jest liczbowe i rośnie o 1 z każdym wykonaniem żeby pętla mogła się skończyć, i nie ma nic do mat.
Może prościej będzie jak pokaże ci mój kod php, który właśnie chcę zrobić w js:

Tworzenie tablicy:

  1. $ip = 1;
  2. $lp = $_POST['all_projects']; // liczba projektów
  3. while ($lp >= $ip) {
  4. $x = $_POST['x_'.$ip.''] / 1000;
  5. $y = $_POST['y_'.$ip.''] / 1000;
  6. $materialy[$_POST['mat_'.$ip.'']] += $x * $y;
  7. $ip++;
  8. }


Sumowanie takich samych:

  1. foreach ($materialy as $name => $mkw) {
  2. if ($mkw < 1) {
  3. $pow = 1;
  4. $mat_cena += $material['cena'][$name];
  5. }
  6. else {
  7. $pow = $mkw;
  8. $mat_cena += $pow * $material['cena'][$name];
  9. }
  10. }


Takie foreach sumował mi tablice $materialy gdzie pierwsza wartość w nawiasach była taka sama.

Ten post edytował yarek12 17.06.2011, 12:40:39
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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: 20.12.2025 - 23:02