Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> problem z pętlami i tablicami
MitS
post 20.02.2007, 08:16:47
Post #1





Grupa: Zarejestrowani
Postów: 262
Pomógł: 5
Dołączył: 8.02.2005
Skąd: Olsztyn / Zatorze

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


Witam!

Już mnie krew zalewa więc byłbym wdzięczny za pomoc smile.gif
Mój problem polega na tym że mam taką tablicę:

  1. <?php
  2. [ag] => Array (
  3. [rform] => Array (
  4. [0] => Array (
  5. [rooms] => Array (
  6. [0] => Array (
  7. [room_id] => 4
  8. [room_name] => Apartament1
  9. )
  10.  
  11. [1] => Array (
  12. [room_id] => 5
  13. [room_name] => Apartament2
  14. )
  15.  
  16. [2] => Array (
  17. [room_id] => 3
  18. [room_name] => Apartament3
  19. )
  20.  
  21. [3] => Array (
  22. [room_id] => 1
  23. [room_name] => Apartament4
  24. )
  25.  
  26. [4] => Array (
  27. [room_id] => 2
  28. [room_name] => Apartament5
  29. )
  30.  )
  31. [start_date] => 2007-02-20
  32. [end_date] => 2007-02-22
  33. [hotel_name] => Hotel pierwszy
  34. [hotel_alias] => hotel_pierwszy
  35. )
  36. [1] => Array (
  37. [rooms] => Array (
  38. [0] => Array (
  39. [room_id] => 17
  40. [room_name] => Pokoj1
  41. )
  42. [1] => Array (
  43. [room_id] => 18
  44. [room_name] => pokoj2
  45. )
  46. )
  47. [start_date] => 2007-02-20
  48. [end_date] => 2007-02-22
  49. [hotel_name] => Hotel test
  50. [hotel_alias] => hotel_test
  51. )
  52. )
  53. )
  54. ?>


No i chciałbym zrobić coś takiego, że mam dwa pola wyboru select (pierwszy wybierz hotel, drugi wybierz pokój).
Mój problem polega na tym że nie wiem jak zrobić pętle takie że:

* Wczyta do pierwszego selecta nazwy hoteli (w moim wypadku dwa: Hotel pierwszy i Hotel test),
* wczyta do drugiego selecta wszystkie pozycje z nazwami pokojów z danego hotelu ([room_name]) czyli np. dla Hotel test będą to:
Pokoj1 i Pokoj2

i np. po zmianie hotelu z pierwszego selecta zmienią się nazwy pokoi w drugim...
Ja to zrobiłem tak:

  1. <?php
  2. //----------------------------------------------------- HOTEL ------------------------------//
  3. $hotel = "<select id='hotel' class='hotel' name='hotel_name' tabindex='101'>n";
  4.  
  5. for($i=0; $i<count($data['ag']['rform']); $i++)
  6. {
  7. if(is_array($data['ag']['rform'][$i]['rooms']))
  8. {
  9.  $hotel.='<option value="'.$data['ag']['rform'][$i]['hotel_alias'].'">'.$data['ag']['rform'][$i]['hotel_name'].'</option>';
  10. }
  11. }
  12.  
  13. $hotel.="</select>";
  14.  
  15. //----------------------------------------------------- POKOJE -------------------------------//
  16. $reservation = "<select id='rooms' class='rooms' name='rooms' tabindex='101'>n";
  17.  
  18. for($i=0; $i<count($data['ag']); $i++)
  19. {
  20. if(is_array($data['ag']['rform'][$i]['rooms']))
  21. {
  22. foreach($data['ag']['rform'][$i]['rooms'] as $key => $values)
  23. {
  24. $k[$i]="<option value='".$values['room_id']."'>".$values['room_name']."</option>n"; 
  25. $reservation.= $k[$i];
  26. }
  27. }
  28. }
  29.  
  30. $reservation.="</select>";
  31. ?>


Ale w tym wypadku do drugiego selecta ładują się wszystkie pokoje (z pierwszego hotelu i drugiego) a powinno się tylko z wybranego (i tu mi nie wychodzi)....

Dodatkowo nie wiem jak zrobic js by w zdarzeniu onchange selecta pierwszego bez przeładowania zmieniały mi sie nazwy pokoju po wybraniu danego hotelu ...

Pomożecie questionmark.gif
Please bo mnie już nerwica bierze ...

Pozdro


-------------------------
ortograf w temacie bił po oczach
przy okazji poprawiłem te w poście

~Cienki1980


Ten post edytował Cienki1980 20.02.2007, 08:24:40
Go to the top of the page
+Quote Post
misiek172
post 20.02.2007, 09:26:30
Post #2





Grupa: Zarejestrowani
Postów: 656
Pomógł: 3
Dołączył: 26.10.2005
Skąd: Częstochowa

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


hmm nie prościej zrobić to w JS?

robisz sobie 3 tablice, 1 z hotelami 2 pozostałe ich pokojami.

Potem za pomocą JS polecenia selectedIndex sprawdzasz który hotel został wybrany i uzupełniasz drugi select daną tablicą.


--------------------
zmoderowano - waga i rozmiar
Go to the top of the page
+Quote Post
MitS
post 20.02.2007, 21:05:46
Post #3





Grupa: Zarejestrowani
Postów: 262
Pomógł: 5
Dołączył: 8.02.2005
Skąd: Olsztyn / Zatorze

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


No własnie tak nie bardzo ... bo te dane tablicowe pobierane są z bazy a żeby obsłozyc takie cos to albo php albo ajaxem, ja zas ajaxa nie do końca kminie .... więc jeśli ktoś byłby wstanie mi pomóc z samymi pętlami byłbym wdzięczny ...
Pozdro

Ten post edytował MitS 20.02.2007, 21:05:58
Go to the top of the page
+Quote Post
Cienki1980
post 21.02.2007, 08:46:41
Post #4





Grupa: Przyjaciele php.pl
Postów: 1 590
Pomógł: 40
Dołączył: 11.01.2007
Skąd: Centrum

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


Skorzystaj z tego SKRYPTU.

Generuj go w php na podstawie danych wyciąganych z bazy a potem po prostu zamieść wygenerowany kod na stronie.

Ja dawno temu korzystałem z tego i działało bez zarzutu.


--------------------
404
Go to the top of the page
+Quote Post
MitS
post 23.02.2007, 08:02:32
Post #5





Grupa: Zarejestrowani
Postów: 262
Pomógł: 5
Dołączył: 8.02.2005
Skąd: Olsztyn / Zatorze

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


ok dzieki ... to załatwia sprawe dynamicznego zmieniania wartosci w selectach .....
Teraz pozostaje sprawa stworzenie dwoch (lub trzech) odpowiednich pętli ładujących dane z tablicy do selectow.

Jakieś propozycje questionmark.gif
Go to the top of the page
+Quote Post
Cienki1980
post 23.02.2007, 14:16:19
Post #6





Grupa: Przyjaciele php.pl
Postów: 1 590
Pomógł: 40
Dołączył: 11.01.2007
Skąd: Centrum

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


Cytat(MitS @ 23.02.2007, 08:02:32 ) *
ok dzieki ... to załatwia sprawe dynamicznego zmieniania wartosci w selectach .....
Teraz pozostaje sprawa stworzenie dwoch (lub trzech) odpowiednich pętli ładujących dane z tablicy do selectow.

Jakieś propozycje questionmark.gif

Wszystko zależy od tego jak masz dane w bazie. Możesz wykorzystać for(), foreach() while() ... wybór masz duży.


--------------------
404
Go to the top of the page
+Quote Post
MitS
post 26.02.2007, 23:40:35
Post #7





Grupa: Zarejestrowani
Postów: 262
Pomógł: 5
Dołączył: 8.02.2005
Skąd: Olsztyn / Zatorze

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


to znaczy dane mam takie jakie są w tablicy powyżej ...

Ja chcem użyć pętli for i foreach ale nie wychodzi mi to...
Przypominam że mój problem polega na tym iż do pierwszego selecta chcem załadowac nazwy hoteli i to działa:

  1. <?php
  2. $hotel = "<select id='hotel' class='hotel' name='hotel_name' tabindex='101'>n";
  3.  
  4. for($i=0; $i<count($data['ag']['rform']); $i++)
  5. {
  6. if(is_array($data['ag']['rform'][$i]['rooms']))
  7. {
  8.  $hotel.='<option value="'.$data['ag']['rform'][$i]['hotel_alias'].'">'.$data['ag']['rform'][$i]['hotel_name'].'</option>';
  9. }
  10. }
  11.  
  12. $hotel.="</select>";
  13. ?>


Zaś do drugiego selecta chcem załądować nazwy pokoi i to już mi nie do końca działa (bo ładują się wszystie nazwy pokoi ze wszystkich hoteli):

  1. <?php
  2. $reservation = "<select id='rooms' class='rooms' name='rooms' tabindex='101'>n";
  3.  
  4. for($i=0; $i<count($data['ag']); $i++)
  5. {
  6. if(is_array($data['ag']['rform'][$i]['rooms']))
  7. {
  8. foreach($data['ag']['rform'][$i]['rooms'] as $key => $values)
  9. {
  10. $k[$i]="<option value='".$values['room_id']."'>".$values['room_name']."</option>n"; 
  11. $reservation.= $k[$i];
  12. }
  13. }
  14. }
  15. $reservation.="</select>";
  16. ?>


a jak zrobić by np. jak będzie w polu select "Hotel pierwszy" to do selecta drugiego były ładowane pokoje z tablicy:


[rform] => Array (
[0] => Array (
[rooms] => Array (
[0] => Array (
[room_id] => 4
[room_name] => Apartament1
)

[1] => Array (
[room_id] => 5
[room_name] => Apartament2
)

[2] => Array (
[room_id] => 3
[room_name] => Apartament3
)

[3] => Array (
[room_id] => 1
[room_name] => Apartament4
)

[4] => Array (
[room_id] => 2
[room_name] => Apartament5
)
)
[start_date] => 2007-02-20
[end_date] => 2007-02-22
[hotel_name] => Hotel pierwszy
[hotel_alias] => hotel_pierwszy
)


Prosze o pomoc bo kombinuje i kombinuje bez pozytywnych rezultatów sad.gif

Ten post edytował MitS 26.02.2007, 23:43:09
Go to the top of the page
+Quote Post
Cienki1980
post 27.02.2007, 08:11:12
Post #8





Grupa: Przyjaciele php.pl
Postów: 1 590
Pomógł: 40
Dołączył: 11.01.2007
Skąd: Centrum

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


Hmmm nie do końca o to mi chodziło w jaki sposób umieszczasz dane w tablicy bo to już widziałem. Chodzi mi o to jak masz umieszczone je w bazie danych.
Ja bym zabrał się do tego jakoś tak ( zakładając, że mam tabelę hotele oraz tabele pokoje połączone ze sobą przez ID_HOTELU )
1. Wyciągam dane o hotelach.
a. dla każdego hotelu wpisuje dane do tablicy JS
b. dla każdego hotelu wyciągam pokoje
c. wpisuje je do tablicy JS
2. Tak wygenerowany kod JS umieszczam na stronie html
3. Mam dwa selecty, z których zawartość drugiego zmienia mi się w zależności od wybranego pierwszego.

Mówiąc o tablicach JS mam na myśli taką strukturę jaka została pokazana w tym skrypcie JS, do którego link pokazałem kilka postów wyżej.


--------------------
404
Go to the top of the page
+Quote Post
MitS
post 27.02.2007, 22:23:57
Post #9





Grupa: Zarejestrowani
Postów: 262
Pomógł: 5
Dołączył: 8.02.2005
Skąd: Olsztyn / Zatorze

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


kurde no nie moge tak jak ty piszesz zrobić - za małe moje umiejętności :/ ....
Ale zrobiłem troche inacze winksmiley.jpg

  1. <?php
  2. $count = count($data['ag']['rform']);
  3.  
  4. //----------------------------------------------------- HOTELE i POKOJE ------------------------------//
  5.  
  6. $hotel = '<select id="hotel" class="hotel" name="hotel_name" onchange="sh_select(this.value)">';
  7. for($i=0; $i<$count; $i++)
  8. {
  9.  if(is_array($data['ag']['rform'][$i]['rooms']))
  10.  {
  11. $hotel.='<option id="hotel'.$i.'" value="'.$data['ag']['rform'][$i]['hotel_alias'].'">
  12. '.$data['ag']['rform'][$i]['hotel_name'].'</option>'."n";
  13.  if($i==0)
  14.  $reservation[$i] = '<select id="room'.$i.'" class="room" name="room">'."n";
  15.  else
  16.  $reservation[$i] = '<select id="room'.$i.'" class="visiblity" name="room" disabled="disabled">'."n";
  17.  
  18.  foreach($data['ag']['rform'][$i]['rooms'] as $key => $values)
  19.  {
  20.  $reservation[$i].='<option value="'.$values['room_id'].'">'.$values['room_name'].'</option>'."n";
  21.  }
  22. $reservation[$i] .= '</select>'."n";
  23.  }
  24. }
  25. $hotel.='</select>';
  26.  
  27. echo '
  28. <table id="module2" cellspacing="0" cellpadding="0">
  29. <tr>
  30. <td><img src="./_gfx/'.$data['lang'].'/reserv.jpg" alt="" /></td>
  31. </tr>
  32. <tr>
  33. <td>
  34. <br /><br />
  35. <form name="rooms_search" method="post" action="'.SITE_PATH.'/'.$data['lang'].'/reservations/result.html">
  36. <table id="rezerwacje-form" cellspacing="0" cellpadding="0">
  37. <tr>
  38. <td class="bold" colspan="2">'.$lang['reservation_search_hname'].':</td>
  39. </tr>
  40. <tr>
  41. <td colspan="2">'.$hotel.'</td>
  42. </tr>
  43. <tr>
  44. <td class="bold">'.$lang['reservation_search_rname'].':</td>
  45. <td class="bold">'.$lang['reservation_search_ramount'].':</td>
  46. </tr>
  47. <tr>
  48. <td>'.implode(" ",$reservation).'</td>
  49. <td>'.$rooms.'</td>
  50. </tr>
  51. <tr>
  52. <td class="bold" colspan="2">'.$lang['reservation_search_arrive'].':</td>
  53. </tr>
  54. <tr>
  55. <td colspan="2">'.$days_list_a.$months_list_a.$years_list_a.'</td>
  56. </tr>
  57. <tr>
  58. <td class="bold" colspan="2">'.$lang['reservation_search_out'].':</td>
  59. </tr>
  60. <tr>
  61. <td colspan="2">'.$days_list_o.$months_list_o.$years_list_o.'</td>
  62. </tr>
  63. </table>
  64. <div class="vertical-padding">
  65. <input class="reserv-btn-pl" type="submit" value="" onfocus="blur();" />
  66. </div>
  67. </form>
  68. </td>
  69. </tr>
  70. </table>';
  71. ?>


i to działa, w ten sposób że z tej tablicy wypisuje sie do pierwszego selecta nazwa
wszystkich hoteli, a jeśli chodzi o pokoje to tworzy on do każdego hotelu dodatkowe selecty z pokojami (z danego hotelu).

tylko teraz jest tak że jak mam np. 10 hoteli i w każdym jakiś pokój to stworzy mi 10 widocznych selectów ...
A jak zrobić tak by wszystkie były ukryte a tylko widoczny ten select z pokojami który wybrany został hotel...

Ja wiem jak teoretycznie to wykonać ale z praktyką niestety gorzej ...
Ja bym to wykonał tak że:
1.) do pierwszego selecta dopisał id+cyfra do każdego optionsa w nim.
2.) do każdego selecta z pokojami bym dopisał id+ cyfra (ta sama cyfra co wyżej)
3.) Jeżeli bym wybrał pokoj z id+1 to pojawił by mi sie select z pokojami o jakimś id+1
a reszte były by ukryte ....

ale niestety nie wiem jak tego dokonac sad.gifsad.gifsad.gif
Go to the top of the page
+Quote Post
Cienki1980
post 28.02.2007, 07:53:40
Post #10





Grupa: Przyjaciele php.pl
Postów: 1 590
Pomógł: 40
Dołączył: 11.01.2007
Skąd: Centrum

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


Ecchhh kombinujesz jak koń pod górę. Dostałeś sposób na talerzu to stwierdziłeś, że jest zbyt ciężki i wymyśliłeś jeszcze bardziej zamotany.
Poniżej masz przerobiony kod z podanej przeze mnie strony, generowany dynamicznie w PHP. Wystarczy tylko podstawić swoje dane. Nic prostszego.
  1. <?php
  2. //tworzymy tablice z hotelami i pokojami
  3. //w Twoim przypadku musisz wyciągnac je z bazy 
  4. for($i=0;$i<10;$i++)
  5. {
  6.  $hotele[$i]['nazwa']="hotel_".$i; // tutaj wstawiasz nazwe hotelu wyciagnietgo z bazy
  7.  $hotele[$i]['id']=$i; // tutaj wstawiasz id hotelu wyciagnietego z bazy
  8.  for($g=0;$g<rand(2,5);$g++)
  9.  {
  10. $pokoje[$i][$g]['nazwa']="pokoj w hotelu_".$i." numer_".$g; // tutaj wstawiasz nazwe pokoju z bazy
  11. $pokoje[$i][$g]['id']=$g*($i+1); // tutaj wstawiasz id pokoju z bazy
  12.  }
  13. }
  14.  
  15.  
  16. $ile_hoteli=count($hotele);
  17. $js='var groups='.$ile_hoteli.';
  18.  var group_nazwy=new Array(groups);
  19.  var group_wartosc=new Array(groups);
  20.  ';
  21. for($f=0;$f<$ile_hoteli;$f++)
  22. {
  23.  $js.='group_nazwy['.$f.']=new Array();
  24.  group_wartosc['.$f.']=new Array();
  25.  ';
  26.  $ile_pokoi=count($pokoje[$f]);
  27.  for($r=0;$r<$ile_pokoi;$r++)
  28.  {
  29. $js.='group_nazwy['.$f.']['.$r.']="'.$pokoje[$f][$r]['nazwa'].'";
  30. group_wartosc['.$f.']['.$r.']="'.$pokoje[$f][$r]['id'].'";
  31. ';
  32.  }
  33. }
  34.  
  35. ?>
  36.  
  37. <form name="wybor" method="post" action="index.php">
  38. <p><select name="example" id="select1" size="1" onChange="zmien(this.options.selectedIndex);">
  39. <?php
  40. for($g=0;$g<$ile_hoteli;$g++)
  41.  echo "<option value="".$hotele[$g]['id']."">".$hotele[$g]['nazwa']."</option>";
  42. ?>
  43. </select>
  44. <select name="stage2" id="select2" size="1">
  45. <?php
  46. $ile=count($pokoje[0]);
  47. for($e=0;$e<$ile;$e++)
  48.  echo "<option value="".$pokoje[0][$e]['id']."">".$pokoje[0][$e]['nazwa']."</option>";
  49. ?>
  50. </select>
  51. </p>
  52. </form>
  53.  
  54. <script language="javascript">
  55. <!--
  56. var temp=document.getElementById('select2');
  57. <?php echo $js; ?>
  58.  
  59.  
  60. function zmien(x){
  61. for (m=temp.options.length-1;m>0;m--)
  62. temp.options[m]=null
  63. for (i=0;i<group_nazwy[x].length;i++){
  64. temp.options[i]=new Option(group_nazwy[x][i],group_wartosc[x][i])
  65. }
  66. temp.options[0].selected=true
  67. }
  68.  
  69. -->
  70. </script>


--------------------
404
Go to the top of the page
+Quote Post
MitS
post 28.02.2007, 18:52:39
Post #11





Grupa: Zarejestrowani
Postów: 262
Pomógł: 5
Dołączył: 8.02.2005
Skąd: Olsztyn / Zatorze

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


dzięki smile.gif
ratujesz mi życie bo za nic nie mogłem tego zrobić :/

a wnioski to że muszę js sie poduczyć smile.gif

Pozdrawiam


----------
ortografii też chyba musisz biggrin.gif
~Cienki1980
Go to the top of the page
+Quote Post

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: 16.07.2025 - 15:51