Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Pętla foreach zagnieżdżona w for - problem z indeksami
jurcio6
post
Post #1





Grupa: Zarejestrowani
Postów: 40
Pomógł: 0
Dołączył: 4.11.2010

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


Witam.

Mam pewien problem z indeksami. Kod:

  1. //$answers to dwuwymiarowa tablica rekordów pobranych z bazy - załóżmy, że tych rekordów ma tam 3
  2. for($i=0; $i<3; $i++)
  3. {
  4. //jakiś kod do wykonania
  5. $j = 1;
  6. foreach($answers as $row)
  7. {
  8. //jakiś kod do wykonania - $row coś tam - wiadomo, ale problem poniżej:
  9. echo $j.", ";
  10. $j++;
  11. }
  12. }


I teraz problem mam następujący: wynikiem takiej pętli jest: "1, 2, 3, 4, 5, 6, 7, 8, 9" - jakim cudem, skoro przy każdej iteracji pętli zewnętrznej for ustawiam licznik $j =1? Czy wynikiem nie powinno być "1, 2, 3, 1, 2, 3, 1, 2, 3"? Jak uzyskać taki efekt?

Proszę o pomoc! Z góry dzięki.

Ten post edytował jurcio6 14.02.2011, 11:59:29
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 11)
Piogola
post
Post #2





Grupa: Zarejestrowani
Postów: 151
Pomógł: 36
Dołączył: 1.02.2011
Skąd: Warszawa

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


Jesteś pewien, że masz 3 rekordy, a nie 9 ?
Go to the top of the page
+Quote Post
darko
post
Post #3





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


Pętla foreach ma to do siebie, że iteruje po całej tablicy bez żadnych ograniczeń,natomiast Ty ustawiasz wartość zmiennej $j już poza nią. To co robi teraz ten kod, to trzykrotny foreach po całej tablicy. Jeśli chciałbyś wyciągnąć co trzeci rekord to należałoby zrobić małą modyfikację związaną z wykorzystaniem reszty z dzielenia (sprawdzasz czy modulo % 3 z $j == 0) i wszystko w jednym foreachu.
Go to the top of the page
+Quote Post
jurcio6
post
Post #4





Grupa: Zarejestrowani
Postów: 40
Pomógł: 0
Dołączył: 4.11.2010

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


Pętla działa w porządku - tzn. zgodnie z moim zamierzeniem. Wykorzystuję ją przy ankietach i służy ona konkretnie do wypisania wszystkich odpowiedzi do danego pytania - po pytaniach iteruje for, po odpowiedziach foreach - tu wszystko z pewnością jest dobrze. Wyciąłem to po prostu z kontekstu i dlatego wygląda to tak, jakby iterowała 3 razy po tym samym - w rzeczywistości przy każdej iteracji zmienia się argument $answers.

Problem jest taki, że chciałem nazywać odpowiedzi dla każdego pytania 1, 2, 3, 4.. , a tutaj nie resetuje się ten index $j i mi to uniemożliwia. Konkretnie chodzi o atrybuty value dla inputów. Nie chcę korzystać z $row['question_id'], który jest wyciągany z bazy i po czasie może przyjmować dosyć wysokie wartości. Cały kod wygląda mniej więcej tak:
  1. echo "<table align=\"center\">";
  2. for($i=0; $i<$nq; $i++)
  3. {
  4. echo "\n<tr><td style=\"padding: 15px 0px 5px 0px;\"><b>Pytanie ";
  5. echo $i+1 .": <i>".$questions[$i]['question_text']."</i></b>";
  6. if($questions[$i]['multiple_choice']==1)
  7. echo " [wybór wielokrotny]";
  8. echo "</td></tr>\n<tr><td style=\"padding-left: 30px;\">";
  9. $j = 1;
  10. foreach($answers as $row)
  11. {
  12. if($questions[$i]['question_id'] == $row['question_id'])
  13. if($questions[$i]['multiple_choice']==1)
  14. echo "\n<label name=\"".$row['question_id']."\"><input type=\"checkbox\" name=\"question_".$i."[]\" value=\"".$j."\" />".$row['answer_text']."</label><br />";
  15. else
  16. echo "\n<label name=\"".$row['question_id']."\"><input type=\"radio\" name=\"question_".$i."\" value=\"".$j."\" />".$row['answer_text']."</label><br />";
  17. $j++;
  18. }
  19. echo "</td></tr>";
  20. }
  21. echo "\n</table>";

Wersja mocno robocza (IMG:style_emoticons/default/smile.gif)

//edit: oczywiście chodzi o wartości value dla inputów, a nie o name.

Ten post edytował jurcio6 14.02.2011, 12:23:28
Go to the top of the page
+Quote Post
darko
post
Post #5





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


Dodaj dla porządku odpowiednie nawiasy klamrowe do instrukcji warunkowych if i sprawdź efekt.
Go to the top of the page
+Quote Post
jurcio6
post
Post #6





Grupa: Zarejestrowani
Postów: 40
Pomógł: 0
Dołączył: 4.11.2010

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


Niestety nic się nie zmieniło. Poszczególne pola <input.. /> nadal przyjmują wartości value="" od 1 do 23 (tyle jest rekordów).

  1. echo "<table align=\"center\">";
  2. for($i=0; $i<$nq; $i++)
  3. {
  4. echo "\n<tr><td style=\"padding: 15px 0px 5px 0px;\"><b>Pytanie ";
  5. echo $i+1 .": <i>".$questions[$i]['question_text']."</i></b>";
  6. if($questions[$i]['multiple_choice']==1)
  7. {
  8. echo " [wybór wielokrotny]";
  9. }
  10. echo "</td></tr>\n<tr><td style=\"padding-left: 30px;\">";
  11. $j = 1;
  12. foreach($answers as $row)
  13. {
  14. if($questions[$i]['question_id'] == $row['question_id'])
  15. {
  16. if($questions[$i]['multiple_choice']==1)
  17. {
  18. echo "\n<label name=\"".$row['question_id']."\"><input type=\"checkbox\" name=\"question_".$i."[]\" value=\"".$j."\" />".$row['answer_text']."</label><br />";
  19. }
  20. else
  21. {
  22. echo "\n<label name=\"".$row['question_id']."\"><input type=\"radio\" name=\"question_".$i."\" value=\"".$j."\" />".$row['answer_text']."</label><br />";
  23. }
  24. }
  25. $j++;
  26. }
  27. echo "</td></tr>";
  28. }
  29. echo "\n</table>";


Efekt:
  1. <table align="center">
  2. <tr><td style="padding: 15px 0px 5px 0px;"><b>Pytanie 1: <i>Czy wolisz kolory jasne czy ciemne?</i></b></td></tr>
  3. <tr><td style="padding-left: 30px;">
  4. <label name="92"><input type="radio" name="question_0" value="1" />jasne</label><br />
  5. <label name="92"><input type="radio" name="question_0" value="2" />ciemne</label><br />
  6. <label name="92"><input type="radio" name="question_0" value="3" />jest mi to obojętne</label><br /></td></tr>
  7.  
  8. <tr><td style="padding: 15px 0px 5px 0px;"><b>Pytanie 2: <i>Czy wolisz odcienie stonowane czy jaskrawe?</i></b></td></tr>
  9. <tr><td style="padding-left: 30px;">
  10. <label name="93"><input type="radio" name="question_1" value="4" />jaskrawe</label><br />
  11. <label name="93"><input type="radio" name="question_1" value="5" />stonowane</label><br />
  12. <label name="93"><input type="radio" name="question_1" value="6" />jest mi to obojętne</label><br /></td></tr>
  13. <tr><td style="padding: 15px 0px 5px 0px;"><b>Pytanie 3: <i>Jakiego koloru koszulki lubisz nosić?</i></b> [wybór wielokrotny]</td></tr>
  14. <tr><td style="padding-left: 30px;">
  15. <label name="94"><input type="checkbox" name="question_2[]" value="7" />białe</label><br />
  16.  
  17. <label name="94"><input type="checkbox" name="question_2[]" value="8" />czarne</label><br />
  18. <label name="94"><input type="checkbox" name="question_2[]" value="9" />zielone</label><br />
  19. <label name="94"><input type="checkbox" name="question_2[]" value="10" />czerwone</label><br />
  20. <label name="94"><input type="checkbox" name="question_2[]" value="11" />żółte</label><br />
  21. <label name="94"><input type="checkbox" name="question_2[]" value="12" />niebieskie</label><br /></td></tr>
  22. <tr><td style="padding: 15px 0px 5px 0px;"><b>Pytanie 4: <i>Czy lubisz odcienie szarości?</i></b></td></tr>
  23. <tr><td style="padding-left: 30px;">
  24. <label name="95"><input type="radio" name="question_3" value="13" />tak</label><br />
  25. <label name="95"><input type="radio" name="question_3" value="14" />nie</label><br /></td></tr>
  26.  
  27. <tr><td style="padding: 15px 0px 5px 0px;"><b>Pytanie 5: <i>Jaki jest twój ulubiony kolor?</i></b></td></tr>
  28. <tr><td style="padding-left: 30px;">
  29. <label name="96"><input type="radio" name="question_4" value="15" />pomarańczowy</label><br />
  30. <label name="96"><input type="radio" name="question_4" value="16" />fioletowy</label><br />
  31. <label name="96"><input type="radio" name="question_4" value="17" />niebieski</label><br />
  32. <label name="96"><input type="radio" name="question_4" value="18" />żółty</label><br />
  33. <label name="96"><input type="radio" name="question_4" value="19" />zielony</label><br />
  34. <label name="96"><input type="radio" name="question_4" value="20" />czerwony</label><br />
  35. <label name="96"><input type="radio" name="question_4" value="21" />biały</label><br />
  36.  
  37. <label name="96"><input type="radio" name="question_4" value="22" />czarny</label><br />
  38. <label name="96"><input type="radio" name="question_4" value="23" />turkusowy</label><br /></td></tr>


Pożądany efekt:
  1. <table align="center">
  2. <tr><td style="padding: 15px 0px 5px 0px;"><b>Pytanie 1: <i>Czy wolisz kolory jasne czy ciemne?</i></b></td></tr>
  3. <tr><td style="padding-left: 30px;">
  4. <label name="92"><input type="radio" name="question_0" value="1" />jasne</label><br />
  5. <label name="92"><input type="radio" name="question_0" value="2" />ciemne</label><br />
  6. <label name="92"><input type="radio" name="question_0" value="3" />jest mi to obojętne</label><br /></td></tr>
  7.  
  8. <tr><td style="padding: 15px 0px 5px 0px;"><b>Pytanie 2: <i>Czy wolisz odcienie stonowane czy jaskrawe?</i></b></td></tr>
  9. <tr><td style="padding-left: 30px;">
  10. <label name="93"><input type="radio" name="question_1" value="1" />jaskrawe</label><br />
  11. <label name="93"><input type="radio" name="question_1" value="2" />stonowane</label><br />
  12. <label name="93"><input type="radio" name="question_1" value="3" />jest mi to obojętne</label><br /></td></tr>
  13. <tr><td style="padding: 15px 0px 5px 0px;"><b>Pytanie 3: <i>Jakiego koloru koszulki lubisz nosić?</i></b> [wybór wielokrotny]</td></tr>
  14. <tr><td style="padding-left: 30px;">
  15. <label name="94"><input type="checkbox" name="question_2[]" value="1" />białe</label><br />
  16. <label name="94"><input type="checkbox" name="question_2[]" value="1" />czarne</label><br />
  17. <label name="94"><input type="checkbox" name="question_2[]" value="1" />zielone</label><br />
  18. <label name="94"><input type="checkbox" name="question_2[]" value="1" />czerwone</label><br />
  19. <label name="94"><input type="checkbox" name="question_2[]" value="1" />żółte</label><br />
  20. <label name="94"><input type="checkbox" name="question_2[]" value="1" />niebieskie</label><br /></td></tr>
  21. <tr><td style="padding: 15px 0px 5px 0px;"><b>Pytanie 4: <i>Czy lubisz odcienie szarości?</i></b></td></tr>
  22. <tr><td style="padding-left: 30px;">
  23. <label name="95"><input type="radio" name="question_3" value="1" />tak</label><br />
  24. <label name="95"><input type="radio" name="question_3" value="2" />nie</label><br /></td></tr>
  25.  
  26. <tr><td style="padding: 15px 0px 5px 0px;"><b>Pytanie 5: <i>Jaki jest twój ulubiony kolor?</i></b></td></tr>
  27. <tr><td style="padding-left: 30px;">
  28. <label name="96"><input type="radio" name="question_4" value="1" />pomarańczowy</label><br />
  29. <label name="96"><input type="radio" name="question_4" value="2" />fioletowy</label><br />
  30. <label name="96"><input type="radio" name="question_4" value="3" />niebieski</label><br />
  31. <label name="96"><input type="radio" name="question_4" value="4" />żółty</label><br />
  32. <label name="96"><input type="radio" name="question_4" value="5" />zielony</label><br />
  33. <label name="96"><input type="radio" name="question_4" value="6" />czerwony</label><br />
  34. <label name="96"><input type="radio" name="question_4" value="7" />biały</label><br />
  35.  
  36. <label name="96"><input type="radio" name="question_4" value="1" />czarny</label><br />
  37. <label name="96"><input type="radio" name="question_4" value="2" />turkusowy</label><br /></td></tr>


//ignore na pola checkbox - je wiem jak obsłużyć (IMG:style_emoticons/default/smile.gif)

Nadal nie udało mi się uporać z tym problemem - jakieś pomysły? ;/

Ten post edytował jurcio6 14.02.2011, 12:53:54
Go to the top of the page
+Quote Post
vermis
post
Post #7





Grupa: Zarejestrowani
Postów: 279
Pomógł: 56
Dołączył: 3.06.2010
Skąd: Tarnowskie Góry

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


Wykonałem ten twój kod i działa poprawnie. Jesteś pewien, że u ciebie wykonuje się dokładnie to co wkleiłeś?
Go to the top of the page
+Quote Post
jurcio6
post
Post #8





Grupa: Zarejestrowani
Postów: 40
Pomógł: 0
Dołączył: 4.11.2010

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


Dla pewności wykonałem kod jeszcze raz i niestety jest to, co było, czyli value w inputach przyjmują wartości od 1 do 23, a nie tak, jak chcę. Naprawdę nie wiem czemu.

Pracuję na wamp server, PHP 5.3.0 - może przez średnio aktualną wersję? Choć szczerze mówiąc teraz nie jest najlepszy czas na zmiany oprogramowania - muszę szybko skończyć ten projekt.
Go to the top of the page
+Quote Post
TheTester
post
Post #9





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 11.03.2009

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


I ten pierwszy, najprostszy przykład też Ci nie działa? A mógłbyś dla tego uproszczonego przykładu zrobić print_r testowej tablicy jaką tam podajesz?
Go to the top of the page
+Quote Post
greycoffey
post
Post #10





Grupa: Zarejestrowani
Postów: 320
Pomógł: 29
Dołączył: 3.04.2010

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


Btw. optymalizacja pierwszego przykładu:
  1. <?php
  2. // ...
  3. $j = 0; // zamiast $j=0
  4. foreach($answers as $row)
  5. {
  6. //jakiś kod do wykonania - $row coś tam - wiadomo, ale problem poniżej:
  7. echo ++$j.", "; //dodajemy preinkrementacje
  8. // usuawmy $j++;
  9. }
  10. ?>
Go to the top of the page
+Quote Post
donpablo
post
Post #11





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 28.02.2005

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


Cytat
teraz problem mam następujący: wynikiem takiej pętli jest: "1, 2, 3, 4, 5, 6, 7, 8, 9" - jakim cudem, skoro przy każdej iteracji pętli zewnętrznej for ustawiam licznik $j =1? Czy wynikiem nie powinno być "1, 2, 3, 1, 2, 3, 1, 2, 3"? Jak uzyskać taki efekt?


Jak się pisze bzdury to się ma problemy. Proponuje na poczatek zapoznać się z podstawami działania pętli. Poczatkowy fragment skryptu robi dokładnie to co powinien robić - bo tak napisałeś. To samo dotyczy tablic wielowymiarowych.
By uzyskac efekt 1,2,3 trzeba to napisać - chocby tak:
  1. foreach ($answers as $id => $row )
  2. {
  3. for($i=0, $j=1; $i<sizeof($row); $i++, $j++) //lub zamiast $i<sizeof($row) -> $i<3 o ile ilośc komórek równa jest 3
  4. {
  5. echo $j;
  6. }
  7. }

Go to the top of the page
+Quote Post
jurcio6
post
Post #12





Grupa: Zarejestrowani
Postów: 40
Pomógł: 0
Dołączył: 4.11.2010

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


Siadłem ze świeżym umysłem i od razu znalazłem błąd - na który nikt w tym topicu nie wpadł...

Donpablo - być może wiesz dużo, ale nie wpadłeś na najprostsze rozwiązanie. Może i nie znam na tyle dobrze mechanizmów PHP, ale jeśli bym znał, to bym nie potrzebował pomocy na tym forum ani gdziekolwiek indziej. W każdym razie w tym wypadku nie tu leżał problem... pętle działały tak, jak było to przez mnie zamierzone - jedyną rzeczą, którą zrobiłem źle, to inkrementacja $j - powinna ona być tylko wtedy, gdy warunek jest spełniony (czyli gdy znajdę odpowiednie pole), a było zrobione tak, że wykonuje się zawsze (niezależnie od spełnienia warunku). Dodatkowo zmieniłem pętle for na foreach - dla własnej wygody. Dzięki wszystkim za chęci (IMG:style_emoticons/default/smile.gif)

Rozwiązanie:
  1. foreach($questions as $q_row)
  2. {
  3. echo "\n<tr><td style=\"padding: 15px 0px 5px 0px;\"><b>Pytanie ";
  4. echo $i+1 .": <i>".$q_row['question_text']."</i></b>";
  5. if($q_row[$i]['multiple_choice']==1)
  6. {
  7. echo " [wybór wielokrotny]";
  8. }
  9. echo "</td></tr>\n<tr><td style=\"padding-left: 30px;\">";
  10. $j = 0;
  11. foreach($answers as $a_row)
  12. {
  13. if($q_row['question_id'] == $a_row['question_id'])
  14. {
  15. if($q_row['multiple_choice']==1)
  16. {
  17. ++$j; //PROBLEM ROZWIĄZANY
  18. echo "\n<label name=\"".$a_row['question_id']."\"><input type=\"checkbox\" name=\"question_".$i."[]\" value=\"".$j."\" />".$a_row['answer_text']."</label><br />";
  19. }
  20. else
  21. {
  22. ++$j; //PROBLEM ROZWIĄZANY
  23. echo "\n<label name=\"".$a_row['question_id']."\"><input type=\"radio\" name=\"question_".$i."\" value=\"".$j."\" />".$a_row['answer_text']."</label><br />";
  24. }
  25. }
  26. }
  27. echo "</td></tr>";
  28. }
  29. echo "\n</table>";
  30.  


Ten post edytował jurcio6 19.02.2011, 10:59:52
Go to the top of the page
+Quote Post

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: 22.08.2025 - 22:12