Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Wyswietlanie nr tygodni danego miesiaca
Forum PHP.pl > Forum > Przedszkole
alpin
Witam, napotkałem mały problem w swoim skrypcie, banalny, ale nie bardzo wiem jak go "ładnie" rozwiązać. A mianowicie ... tworze kalendaria ..
Główna daną wejściową jest rok ... później robię pętle na poszczególne tygodnie i wyciągam sobie potrzebne dane. Potrzebuje wyświetlić numery tygodni poszczególnego miesiąca, doszedłem do czegoś takiego:

  1. <?
  2.  
  3. $year =2013;
  4.  
  5. for($week_number=1; $week_number<53; $week_number++)
  6.  
  7. {
  8. if($week_number<10) { $week_number="0$week_number";}
  9.  
  10. $miesiac_7_dnia = date("n",strtotime($year."-W".$week_number."-7")); //n Liczbowa forma miesiąca, bez zer wiodących 1 aż do 12
  11. $rok_7_dnia = date("Y",strtotime($year."-W".$week_number."-7"));
  12.  
  13.  
  14. $ile_dni_ma_miesiac=date("t",strtotime("1-$miesiac_7_dnia-$rok_7_dnia"));
  15.  
  16. //echo "$ile_dni_ma_miesiac<br><Br>";
  17.  
  18. $nr_tyg_start=date("W", strtotime("01-$miesiac_7_dnia-$rok_7_dnia"));
  19. $nr_tyg_stop=date("W",strtotime("$ile_dni_ma_miesiac-$miesiac_7_dnia-$rok_7_dnia"));
  20.  
  21. //echo "nr tyg start $nr_tyg_start nr tyg stop $nr_tyg_stop<br><br>";
  22.  
  23. echo "Miesiac nr $miesiac_7_dnia posiada nastepujace nr tygodni:<br>";
  24. for($i=$nr_tyg_start; $i<=$nr_tyg_stop; $i++){
  25.  
  26. echo (int)$i."<br>";
  27. }
  28. echo "<br>";
  29. }
  30.  
  31. ?>


I to działa ale nie do końca, ponieważ ostatni dzień grudnia jest juz 1 tygodniem nowego roku i pętla mi sie nie wykonuje, myslałem o jakichś wyrażeniach warunkowych ale to chyba juz będzie przekombinowane, myślę że da się to zrobić w jakiś prostszy sposób ale jakoś nie wpada mi do głowy. Podsumowując chodzi mi o nastepujacy wynik :

  1. $miesiac_7_dnia = date("n",strtotime($year."-W".$week_number."-7")); //n Liczbowa forma miesiąca, bez zer wiodących 1 aż do 12
  2. // np 1 czyli Styczeń
  3. // wynik może być tablica np. $numery_tygodni=array("1","2","3","4","5");
Damonsson
Ale żeś się narobił. Można prościej:

  1. $month = "12";
  2. $year = "2013";
  3.  
  4. $beg = (int) date('W', strtotime("first day of $year-$month"));
  5. $end = (int) date('W', strtotime("last day of $year-$month"));
  6.  
  7. if ($month == '12' && $end == '1') // tutaj rozwiązanie problemu z ostatnim tygodniem grudnia łączącym się z pierwszym tygodniem stycznia.
  8. {
  9. $end = (int) date('W', strtotime($year . '-12-24'));
  10. }
  11.  
  12. print(join(', ', range($beg, $end)));
alpin
Hm tylko że po wywołaniu Twego kodu wywala mi od 1 do 52 a nie taki miało to dawać efekt, skoro masz miesiąc grudzień, to tylko nr tygodni z grudnia miało dać.
Co prawda już to rozwiązałem innym sposobem, może "na piechote" ale działa :

  1. $year =2013;
  2. $week_number=43;
  3.  
  4. if($week_number<10) { $week_number="0$week_number";}
  5.  
  6. $rok_7_dnia = date("Y",strtotime($year."-W".$week_number."-7"));
  7. $miesiac_7_dnia = date("n",strtotime($year."-W".$week_number."-7")); //n Liczbowa forma miesiąca, bez zer wiodących 1 aż do 12
  8.  
  9. $ile_dni_ma_miesiac=date("t",strtotime("1-$miesiac_7_dnia-$rok_7_dnia"));
  10.  
  11. for($i=1;$i<=$ile_dni_ma_miesiac;$i++){
  12. $numery_tyg[]=date("W", strtotime("$i-$miesiac_7_dnia-$rok_7_dnia"));
  13. }
  14.  
  15. $result = array_unique($numery_tyg);
  16.  
  17. print_r ($result);
Damonsson
Nie oszukuj wink.gif

Gdybyś zrobił CTRL+C i CTRL+V wynik dostałbyś taki: 48, 49, 50, 51, 52


edit: Ale fakt, zapomniałem jeszcze o styczniu

Prosty przykład działania w pętli dla każdego miesiąca:
  1. for($month = 1; $month <= 12; $month++) {
  2. $year = "2000";
  3.  
  4. $beg = (int) date('W', strtotime("first day of $year-$month"));
  5. $end = (int) date('W', strtotime("last day of $year-$month"));
  6.  
  7. if ($month == '12' && $end == '1') { // tutaj rozwiązanie problemu z ostatnim tygodniem grudnia łączącym się z pierwszym tygodniem stycznia.
  8. $end = (int) date('W', strtotime($year . '-12-24'));
  9. }
  10.  
  11. if ($month == '1' && $beg > '1') { // tutaj problem dla stycznia
  12. $beg = (int) date('W', strtotime($year . '-01-08'));
  13. }
  14.  
  15. echo $month .' - ';
  16. print(join(', ', range($beg, $end)));
  17. echo '<br />';
  18. }
alpin
Hm .. czegoś nie rozumiem, wynik Twego kodu zwraca mi taki wynik, nie oszukuje bo nie mam po co ;P
  1. 1 - 1<br />2 - 1<br />3 - 1<br />4 - 1<br />5 - 1<br />6 - 1<br />7 - 1<br />8 - 1<br />9 - 1<br />10 - 1<br />11 - 1<br />12 - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51<br />


a z 1 odpowiedzi zwraca :
  1. 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52


To kod źródłowy strony wynikowej. Tak czy inaczej i tak jestem wdzięczny za próbę pomocy, tylko bardziej mnie ciekawi czemu Twój kod u mnie nie działa.
Damonsson
Może "first day of" i "last day of" działają od jakiejś nowszej wersji PHP, której nie masz, ja mam 5.3 akurat.

Ale skoro Twój też działa to nieistotne.
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.