yarek12
15.06.2011, 14:08:41
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.:
mat = new Array();
mat[1] += 0.5;
mat[2] += 1.5;
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ł?
nospor
15.06.2011, 14:38:46
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
yarek12
16.06.2011, 19:08:00
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.
nospor
17.06.2011, 06:59:10
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;
yarek12
17.06.2011, 08:12:16
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ć +
nospor
17.06.2011, 08:17:55
Kod
Petla po i
if (typeof mat[i] == 'undefined')
mat[i]=0;
mat[i] += wartosc;
koniec petli
yarek12
17.06.2011, 08:36:40
"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.
Pawel_W
17.06.2011, 08:38:56
tworzącej
nospor
17.06.2011, 08:54:20
Oczywiście, że tworzącej, co już wsponiał Paweł
yarek12
17.06.2011, 10:26:48
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ść.
nospor
17.06.2011, 10:41:19
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ć.
yarek12
17.06.2011, 11:07:04
Dobra, za 20 min wrzucę kod jak będe w domu.
jeszcze raz dzięki za cierpliwość do mnie
nospor
17.06.2011, 11:08:08
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
yarek12
17.06.2011, 12:04:07
A więc tak html, kod jest dynamiczny, ale pokaże jeden z przekładów:
<input type="hidden" value="3" name="all"> <inpu type="text" name="t_1" value="0.5"><input type="text" name="r_1" value="dom"> <inpu type="text" name="t_2" value="2"><input type="text" name="r_2" value="lato"> <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:
var lp = parseInt(document.getElementById("all").value);
var i = 1;
while (lp >= i) {
if (typeof mat[i] == 'undefined') {
mat[i]=0;
}
else {
mat[i] += parseInt(document.getElementById("t_"+i).value);
}
}
nospor
17.06.2011, 12:07:53
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ę.
yarek12
17.06.2011, 12:14:27
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.
nospor
17.06.2011, 12:22:21
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.
yarek12
17.06.2011, 12:26:55
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.
nospor
17.06.2011, 12:29:45
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.
yarek12
17.06.2011, 12:40:15
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:
$ip = 1;
$lp = $_POST['all_projects']; // liczba projektów
while ($lp >= $ip) {
$x = $_POST['x_'.$ip.''] / 1000;
$y = $_POST['y_'.$ip.''] / 1000;
$materialy[$_POST['mat_'.$ip.'']] += $x * $y;
$ip++;
}
Sumowanie takich samych:
foreach ($materialy as $name => $mkw) {
if ($mkw < 1) {
$pow = 1;
$mat_cena += $material['cena'][$name];
}
else {
$pow = $mkw;
$mat_cena += $pow * $material['cena'][$name];
}
}
Takie foreach sumował mi tablice $materialy gdzie pierwsza wartość w nawiasach była taka sama.
nospor
17.06.2011, 12:44:21
Sorki, mój mózg tego nie ogarnia. Z każdym kolejnym Twoim postem rozumiem coraz mniej.
Podsumowując: myk z 'undefined' jaki ci podałem jest ok, działa. A jak ty to wstawisz w swój kod, którego ja nie rozumiem, to juz Twoja sprawa lub kogoś innego kto będzie po mnie próbował to zrozumieć
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.