Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z tablicami - PHP.
Forum PHP.pl > Forum > PHP
bercik809
Witam wszystkich,

Jestem nowym użytkownikiem, cieszę się, że znalazłem to forum i chciałem wszystkich przywitać 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.
Radeqq
  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
bercik809
A w którym miejscu wstawił byś switch w tej pętli foreach?
Radeqq
@bercik809 musisz sam pokombinować wink.gif A jak nie to dział giełda.
bercik809

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...
Radeqq
Linia 19:
  1. switch($czas_minuty && $czas_sekundy){

Zastanów się którą zmienną (jedną) powinieneś porównywać przez switch.
bercik809
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ę.
Radeqq
Co masz w zmiennej $czas_sekundy a co porównujesz w switch? (hint: spacja)
bercik809
$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ą.
Radeqq
Nie zrozumieliśmy się: popatrz, $czas_sekundy zawiera:
a) String(4) " rok"
cool.gif String(8) " miesiac"

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

Co nie jest to samo.
bercik809
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!
CuteOne
  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);
bercik809
Prosiłbym wszystkich o przetestowanie tego skryptu i proszę powiedzcie mi co jest w nim nie tak.
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.
Invision Power Board © 2001-2025 Invision Power Services, Inc.