Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Problem z tablicami - PHP., Odmiana przez przypadki.
bercik809
post
Post #1





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 19.06.2013
Skąd: Wrocław

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


Witam wszystkich,

Jestem nowym użytkownikiem, cieszę się, że znalazłem to forum i chciałem wszystkich przywitać (IMG:style_emoticons/default/smile.gif)

Mój pierwszy post będzie dotyczył problemu z tablicami, a mianowicie proszę spojrzeć na kod:

  1. function secondToString( $Seconds ) {
  2.  
  3. $zmienne_jednostki = array("rok", "lata", "miesiace", "miesiecy", "dzien", "godzina", "godziny", "minuta", "minuty", "sekundy", "sekunda");
  4. $jednostki = array(
  5. 60*60*24*365 => ' lat',
  6. 60*60*24*30 => ' miesiac', // miesiace
  7. 60*60*24 => ' dni', // dni
  8. 60*60 => ' godzin', // godziny
  9. 60 => ' minut', // minuty
  10. 1 => ' sekund', // sekundy
  11. );
  12.  
  13.  
  14. $zawartosc = '';
  15. foreach( $jednostki As $czas_minuty => $czas_sekundy ) {
  16. $iDiv = $Seconds/$czas_minuty;
  17. if( $iDiv >= 1 ) {
  18. $x = floor( $iDiv );
  19. $zawartosc .= $x.''.$czas_sekundy.' ';
  20. $Seconds-= $x*$czas_minuty;
  21. }
  22.  
  23.  
  24. if(date("m") == 01 || 03 || 05 || 07 || 08 || 10 || 12 ){
  25.  
  26. $zamien = array(60*60*24*31 => 'miesiac');
  27. array_replace($jednostki, $zamien);
  28. }
  29.  
  30. else {
  31.  
  32. $zamien = array(60*60*24*30 => 'miesiac');
  33. array_replace($jednostki, $zamien);
  34. }
  35.  
  36. if(date("L")){
  37.  
  38. $zamien = array(60*60*24*28 => 'miesiac');
  39. array_replace($jednostki, $zamien);
  40. }
  41.  
  42. }
  43.  
  44. return $zawartosc;
  45. }
  46.  
  47.  
  48. echo secondToString($name = $_REQUEST['name']);


Chodzi o to by, nie zwracało mi wyniku tylko i wyłącznie typu: 1 lata 2 dnia 5 miesiac - tylko 1 rok 2 dni 5 miesięcy.
Męczę się z tym nie miłosiernie i nie mogę tego rozwiązać.
Proszę o jakąkolwiek pomoc, jeżeli będzie potrzeba więcej szczegółów odnośnie problemu postaram się dopisać jak najwięcej.
Skrypt po wpisaniu w formularzu html i naciśnięciu przycisku dzięki ajaksowi bez odświeżania zamienia wpisaną ilość sekund na ilość sekund,
minut, dni, godzin, miesięcy i lat.
I wszystkie nazwy lat, miesiecy, dni itd. idą z jednej tablicy. I chodzi mi o to, co mam dopisać aby nazwy z tablicy odmieniały się przez
przypadki, tzn. nie były sztywne. Jak już pisałem, nie 2 lat, tylko 2 lata itd.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 12)
Radeqq
post
Post #2





Grupa: Zarejestrowani
Postów: 15
Pomógł: 2
Dołączył: 10.05.2008

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


  1. if(date("m") == 01 || 03 || 05 || 07 || 08 || 10 || 12 ){
  2. //kod
  3. }
  4. else {
  5. //kod
  6. }


Ten zapis nie zrobi tego co Ty chcesz. Od 21 linii (po zakończeniu pętli foreach) zwracana wartość jest w $zawartosc; Ty natomiast w warunku sprawdzasz czy aktualny miesiąc (obecnie date("m") zwróci wartość String("06"), za 11 dni String("07")) należy do pewnych liczb. Warunek w sumie też jest niepoprawnie zapisany, jak już powinno powinno być:
  1. if(date("m") === "01" || date("m") ==="03"){}


Jeśli ten kod miałby zostać to zmodyfikowałbym go tak:
1. Zostawić kod do 21 linii + return;
2. W pętli foreach w odpowiednim miejscu dodać switch w którym sprawdzałby zmienną $czas_sekundy (chyba źle nazwana bo przechowuje wartości takie jak "lat", "miesiące" itp);
3. Np. jeśli case 'miesiac' to wtedy dodać odpowiednie ify i ustalić zmienną np. $czas_slownie="miesięcy";
4. Wpakować zmienną $czas_slownie do $zawartosc
Go to the top of the page
+Quote Post
bercik809
post
Post #3





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 19.06.2013
Skąd: Wrocław

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


A w którym miejscu wstawił byś switch w tej pętli foreach?
Go to the top of the page
+Quote Post
Radeqq
post
Post #4





Grupa: Zarejestrowani
Postów: 15
Pomógł: 2
Dołączył: 10.05.2008

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


@bercik809 musisz sam pokombinować (IMG:style_emoticons/default/wink.gif) A jak nie to dział giełda.
Go to the top of the page
+Quote Post
bercik809
post
Post #5





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 19.06.2013
Skąd: Wrocław

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



Część kodu, który działa tak jak potrzebuje:

  1. <?php
  2.  
  3. function secondToString( $Seconds ) {
  4.  
  5.  
  6. $jednosci = array(
  7. 60*60*24*365 => ' rok', // lata
  8. 60*60*24*30 => ' miesiac', // miesiace
  9. 60*60*24 => ' dzien', // dni
  10. 60*60 => ' godzina', // godziny
  11. 60 => ' minuta', // minuty
  12. 1 => ' sekunda', // sekundy
  13. );
  14.  
  15. $zawartosc = '';
  16. foreach( $jednosci As $czas_minuty => $czas_sekundy) {
  17. $iDiv = $Seconds/$czas_minuty;
  18.  
  19. switch($czas_minuty && $czas_sekundy){
  20.  
  21. case 'sekunda':
  22.  
  23. if($iDiv >= 2 && $iDiv <= 4){
  24.  
  25. $czas_slownie = " sekundy";
  26. $x = floor( $iDiv );
  27. $zawartosc .= $x.''.$czas_slownie.' ';
  28. $Seconds-= $x*$czas_minuty;
  29. break;
  30.  
  31. } // zakonczenie instrukcji if($iDiv >= 2 && $iDiv <= 4).
  32.  
  33. if($iDiv >= 5){
  34.  
  35. $czas_slownie = " sekund";
  36. $x = floor( $iDiv );
  37. $zawartosc .= $x.''.$czas_slownie.' ';
  38. $Seconds-= $x*$czas_minuty;
  39. break;
  40.  
  41. } // zakonczenie instrukcji if($iDiv >= 5).
  42.  
  43. case 'minuta':
  44.  
  45. if($iDiv >= 2 && $iDiv <= 4){
  46.  
  47. $czas_slownie = " minuty";
  48. $x = floor( $iDiv );
  49. $zawartosc .= $x.''.$czas_slownie.' ';
  50. $Seconds-= $x*$czas_minuty;
  51. break;
  52.  
  53. } // zakończenie instrukcji if - case "minuta".
  54.  
  55. default:
  56.  
  57. if($iDiv >= 1){
  58.  
  59. $x = floor( $iDiv );
  60. $zawartosc .= $x.''.$czas_sekundy.' ';
  61. $Seconds-= $x*$czas_minuty;
  62. break;
  63.  
  64. } // zakonczenie instrukcji if - default.
  65.  
  66. } // zakonczenie wykonania switch ($czas_minuty && $czas_sekundy).
  67.  
  68. } // zakończenie petli foreach.
  69.  
  70.  
  71. return $zawartosc;
  72. } // zakończenie funkcji secondToString.
  73.  
  74.  
  75.  
  76.  
  77. echo secondToString($name = $_REQUEST['name']);
  78.  
  79. ?>


Myślałem, że się udało.
Chociaż, nie do końca działa. Mieszają się minuty z dniami i miesiącami.
Hmmm...

Ten post edytował bercik809 21.06.2013, 10:10:02
Go to the top of the page
+Quote Post
Radeqq
post
Post #6





Grupa: Zarejestrowani
Postów: 15
Pomógł: 2
Dołączył: 10.05.2008

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


Linia 19:
  1. switch($czas_minuty && $czas_sekundy){

Zastanów się którą zmienną (jedną) powinieneś porównywać przez switch.
Go to the top of the page
+Quote Post
bercik809
post
Post #7





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 19.06.2013
Skąd: Wrocław

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


Właśnie w tym jest problem, jak daję taki kod:

  1. foreach( $jednosci As $czas_minuty => $czas_sekundy) {
  2. $iDiv = $Seconds/$czas_minuty;
  3.  
  4. switch($czas_sekundy){
  5.  
  6. case 'sekunda':
  7.  
  8. if($iDiv >= 2 && $iDiv <= 4){
  9.  
  10. $czas_slownie = " sekundy";
  11. $x = floor( $iDiv );
  12. $zawartosc .= $x.''.$czas_slownie.' ';
  13. $Seconds-= $x*$czas_minuty;
  14. break;
  15.  
  16. } // zakonczenie instrukcji if($iDiv >= 2 && $iDiv <= 4).
  17.  
  18. if($iDiv >= 5){
  19.  
  20. $czas_slownie = " sekund";
  21. $x = floor( $iDiv );
  22. $zawartosc .= $x.''.$czas_slownie.' ';
  23. $Seconds-= $x*$czas_minuty;
  24. break;
  25.  
  26. } // zakonczenie instrukcji if($iDiv >= 5).
  27.  
  28. case 'minuta':
  29.  
  30. if($iDiv >= 2 && $iDiv <= 4){
  31.  
  32. $czas_slownie = " minuty";
  33. $x = floor( $iDiv );
  34. $zawartosc .= $x.''.$czas_slownie.' ';
  35. $Seconds-= $x*$czas_minuty;
  36. break;
  37.  
  38. } // zakończenie instrukcji if - case "minuta".
  39.  
  40. if($iDiv >= 5){
  41.  
  42. $czas_slownie = " minut";
  43. $x = floor( $iDiv );
  44. $zawartosc .= $x.''.$czas_slownie.' ';
  45. $Seconds-= $x*$czas_minuty;
  46. break;
  47.  
  48. } // zakończenie instrukcji if ($iDiv >= 5).
  49.  
  50. case 'godzina':
  51.  
  52. if($iDiv >= 2 && $iDiv <= 4){
  53.  
  54. $czas_slownie = " godziny";
  55. $x = floor( $iDiv );
  56. $zawartosc .= $x.''.$czas_slownie.' ';
  57. $Seconds-= $x*$czas_minuty;
  58. break;
  59.  
  60. } // zakończenie instrukcji if ($iDiv >= 2 && $iDiv <= 4) - case "godzina".
  61.  
  62.  
  63. default:
  64.  
  65. if($iDiv >= 1){
  66.  
  67. $x = floor( $iDiv );
  68. $zawartosc .= $x.''.$czas_sekundy.' ';
  69. $Seconds-= $x*$czas_minuty;
  70. break;
  71.  
  72. } // zakonczenie instrukcji if - default.
  73.  
  74. } // zakonczenie wykonania switch ($czas_minuty && $czas_sekundy).
  75.  
  76. } // zakończenie petli foreach.


To wskakuje na default i nic się nie zmienia. Tylko pozostają jednostki z tablicy - nie odmieniają się.
Go to the top of the page
+Quote Post
Radeqq
post
Post #8





Grupa: Zarejestrowani
Postów: 15
Pomógł: 2
Dołączył: 10.05.2008

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


Co masz w zmiennej $czas_sekundy a co porównujesz w switch? (hint: spacja)
Go to the top of the page
+Quote Post
bercik809
post
Post #9





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 19.06.2013
Skąd: Wrocław

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


$czas_sekundy przechowuje tablice:

  1. $jednosci = array(
  2. 60*60*24*365 => ' rok', // lata
  3. 60*60*24*30 => ' miesiac', // miesiace
  4. 60*60*24 => ' dzien', // dni
  5. 60*60 => ' godzina', // godziny
  6. 60 => ' minuta', // minuty
  7. 1 => ' sekunda', // sekundy
  8. );


i to właśnie w switch muszę porównać z tą tablicą.
Go to the top of the page
+Quote Post
Radeqq
post
Post #10





Grupa: Zarejestrowani
Postów: 15
Pomógł: 2
Dołączył: 10.05.2008

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


Nie zrozumieliśmy się: popatrz, $czas_sekundy zawiera:
a) String(4) " rok"
(IMG:style_emoticons/default/cool.gif) String(8) " miesiac"

A ty w switch porównujesz z:
a) String(3) "rok"
(IMG:style_emoticons/default/cool.gif) String(7) "miesiac"

Co nie jest to samo.
Go to the top of the page
+Quote Post
bercik809
post
Post #11





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 19.06.2013
Skąd: Wrocław

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


Zamieszczam kod HTML:

  1. <!DOCTYPE html>
  2. <html lang = "pl">
  3. <meta charset="UTF-8">
  4. <meta name="description" content="Opis">
  5. <title>PHP - OOP</title>
  6. <script type="text/javascript" src="jquery-2.0.2.min.js"></script>
  7. <script type="text/javascript">
  8. $(document).ready(function() {
  9. $("#click").click(function(){
  10. $("#box").load('wyniki.php', {"name" : $("#name").val()} );
  11. });
  12. });
  13. $(document).keypress(function(e) {
  14. if(e.which == 13) {
  15. $("#box").load('wyniki.php', {"name" : $("#name").val()} );
  16. }
  17. });
  18. </script>
  19. </head>
  20.  
  21. Wpisz liczbę sekund: <input type="text" name="name" id='name' size="15">
  22. <input type="button" value="Pokaż" id="click" name="button">
  23.  
  24. <div id="box">
  25.  
  26. </div>
  27. </body>
  28. </html>


Kod PHP:

  1. <?php
  2.  
  3. function secondToString( $Seconds ) {
  4.  
  5. // Tablica $jednosci.
  6. $jednosci = array(
  7. 60*60*24*365 => ' rok', // lata
  8. 60*60*24*31 => ' miesiac', // miesiace
  9. 60*60*24 => ' dzien', // dni
  10. 60*60 => ' godzina', // godziny
  11. 60 => ' minuta', // minuty
  12. 1 => ' sekunda', // sekundy
  13. );
  14.  
  15. $zawartosc = '';
  16. foreach( $jednosci As $czas_minuty => $czas_sekundy) {
  17. $iDiv = $Seconds/$czas_minuty;
  18.  
  19. // Deklarujemy funkcje wyboru switch, aby pomogla nam odmienić tablice $jednosci przez przypadki.
  20. switch($czas_sekundy){
  21.  
  22. case ' sekunda':
  23.  
  24. if($iDiv >= 2 && $iDiv <= 4){
  25.  
  26. $czas_slownie = " sekundy";
  27. $x = floor( $iDiv );
  28. $zawartosc .= $x.''.$czas_slownie.' ';
  29. $Seconds -= $x*$czas_minuty;
  30. break;
  31.  
  32. } // zakonczenie instrukcji if - case sekunda.
  33.  
  34. if($iDiv >= 5){
  35.  
  36. $czas_slownie = " sekund";
  37. $x = floor( $iDiv );
  38. $zawartosc .= $x.''.$czas_slownie.' ';
  39. $Seconds-= $x*$czas_minuty;
  40. break;
  41.  
  42. } // zakonczenie instrukcji if - case sekunda.
  43.  
  44. case ' minuta':
  45.  
  46.  
  47. if($iDiv >= 2 && $iDiv <= 4){
  48.  
  49. $czas_slownie = " minuty";
  50. $x = floor( $iDiv );
  51. $zawartosc .= $x.''.$czas_slownie.' ';
  52. $Seconds-= $x*$czas_minuty;
  53. break;
  54. } // zakonczenie instrukcji if - case minuta.
  55.  
  56. if($iDiv >= 5){
  57.  
  58. $czas_slownie = " minut";
  59. $x = floor( $iDiv );
  60. $zawartosc .= $x.''.$czas_slownie.' ';
  61. $Seconds-= $x*$czas_minuty;
  62. break;
  63. } // zakonczenie instrukcji if - case minuta.
  64.  
  65.  
  66. case ' godzina':
  67.  
  68. if($iDiv >= 2 && $iDiv <= 4){
  69.  
  70. $czas_slownie = " godziny";
  71. $x = floor( $iDiv );
  72. $zawartosc .= $x.''.$czas_slownie.' ';
  73. $Seconds-= $x*$czas_minuty;
  74. break;
  75. } // zakonczenie instrukcji if - case godzina.
  76.  
  77. if($iDiv >= 5){
  78.  
  79. $czas_slownie = " godzin";
  80. $x = floor( $iDiv );
  81. $zawartosc .= $x.''.$czas_slownie.' ';
  82. $Seconds-= $x*$czas_minuty;
  83. break;
  84. } // zakonczenie instrukcji if - case godzina.
  85.  
  86. case ' dzien':
  87.  
  88. if($iDiv >= 2 && $iDiv <= 4){
  89.  
  90. $czas_slownie = " dni";
  91. $x = floor( $iDiv );
  92. $zawartosc .= $x.''.$czas_slownie.' ';
  93. $Seconds-= $x*$czas_minuty;
  94. break;
  95. } // zakonczenie instrukcji if - case dzien.
  96.  
  97. if($iDiv >= 5){
  98.  
  99. $czas_slownie = " dni";
  100. $x = floor( $iDiv );
  101. $zawartosc .= $x.''.$czas_slownie.' ';
  102. $Seconds-= $x*$czas_minuty;
  103. break;
  104. } // zakonczenie instrukcji if - case dzien.
  105.  
  106. case ' miesiac':
  107.  
  108. if($iDiv >= 2 && $iDiv <= 5){
  109.  
  110. $czas_slownie = " miesiace";
  111. $x = floor( $iDiv );
  112. $zawartosc .= $x.''.$czas_slownie.' ';
  113. $Seconds-= $x*$czas_minuty;
  114. break;
  115. } // zakonczenie instrukcji if - case miesiac.
  116.  
  117. if($iDiv >= 5){
  118.  
  119. $czas_slownie = " miesiecy";
  120. $x = floor( $iDiv );
  121. $zawartosc .= $x.''.$czas_slownie.' ';
  122. $Seconds-= $x*$czas_minuty;
  123. break;
  124. } // zakonczenie instrukcji if - case miesiac.
  125.  
  126. case ' rok':
  127.  
  128. if($iDiv >= 2 && $iDiv <= 4){
  129.  
  130. $czas_slownie = " lata";
  131. $x = floor( $iDiv );
  132. $zawartosc .= $x.''.$czas_slownie.' ';
  133. $Seconds-= $x*$czas_minuty;
  134. break;
  135. } // zakonczenie instrukcji if - case rok.
  136.  
  137.  
  138. if($iDiv >= 5){
  139.  
  140. $czas_slownie = " lat";
  141. $x = floor( $iDiv );
  142. $zawartosc .= $x.''.$czas_slownie.' ';
  143. $Seconds-= $x*$czas_minuty;
  144. break;
  145. } // zakonczenie instrukcji if - case rok.
  146.  
  147.  
  148. default:
  149.  
  150. if( $iDiv >= 1 ) {
  151. $x = floor( $iDiv );
  152. $zawartosc .= $x.''.$czas_sekundy.' ';
  153. $Seconds-= $x*$czas_minuty;
  154. } // zakonczenie instrukcji if - case default.
  155.  
  156. } // zakonczenie wykonania switch ($czas_sekundy).
  157.  
  158. // Sprawdzamy miesiące, które mają 31 dni oraz gdy warunek okaże sie prawdą zamieniamy rekord w tablicy.
  159. if(date("m") === "01" || date("m") === "03" || date("m") === "05" || date("m") === "07" || date("m") === "08" || date("m") === "10" || date("m") === "12" ){
  160.  
  161. $zamien = array(60*60*24*31 => ' miesiac');
  162. array_replace($jednosci, $zamien);
  163. }
  164.  
  165. else {
  166.  
  167. $zamien = array(60*60*24*30 => ' miesiac');
  168. array_replace($jednosci, $zamien);
  169. }
  170. // Sprawdzamy rok przestepny.
  171. if(date("L")){
  172.  
  173. $zamien = array(60*60*24*366 => ' rok');
  174. array_replace($jednosci, $zamien);
  175. }
  176.  
  177. } // zakończenie petli foreach.
  178.  
  179. return $zawartosc;
  180. } // zakończenie funkcji secondToString.
  181.  
  182.  
  183.  
  184. echo secondToString($name = $_REQUEST['name']); // Wyświetlamy wyniki wpisane w pole tekstowe.
  185.  
  186. ?>



Przetestujcie proszę i dajcie znać co jest nie tak. Bo wiem, że coś mi źle liczy. Tylko nie za bardzo wiem, jak wykombinować aby liczyło dobrze.
Dzięki!
Go to the top of the page
+Quote Post
CuteOne
post
Post #12





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

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


  1. function licz($czas) {
  2.  
  3. $sekundy = $czas%60;
  4. $minuty = floor($czas/60)%60;
  5. $godziny = floor($czas/60/60)%24;
  6. $dni = floor($czas/60/60/24);
  7.  
  8. echo $dni.' '.$godziny.' '.$minuty.' '.$sekundy;
  9. }
  10.  
  11. licz(121212121);
Go to the top of the page
+Quote Post
bercik809
post
Post #13





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 19.06.2013
Skąd: Wrocław

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


Prosiłbym wszystkich o przetestowanie tego skryptu i proszę powiedzcie mi co jest w nim nie tak.
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: 16.09.2025 - 01:04