Код за сезон!

dakata__92

Super Moderator
Колеги, дайте подобрение на този код! Искам да го опростя и да изчислява и спрямо дните кой е сезонът. Примерно тук съм го направил по месец но не пречи да подавам дни и година. Чудех се и за нещо от сорта на echo date("z", strtotime('1.1.2015'))+1; но не се сещам как да навържа нещата. Уморен съм и направо креативно забих...
PHP:
public function getSeason($month,$hemisphere="northern"){
		//Northern hemisphere seasons 
		$northern=array(
			'Пролет'=> array(3, 4, 5),
			'Лято' 	=> array(6, 7, 8),
			'Есен' 	=> array(9, 10, 11),
			'Зима'	=> array(12, 1, 2)
		);
		//Southern hemisphere seasons
		$southern=array(
			'Пролет'=> array(9, 10, 11),
			'Лято' 	=> array(12, 1, 2),
			'Есен' 	=> array(3, 4, 5),
			'Зима' 	=> array(6, 7, 8)
		);
		foreach($$hemisphere as $key => $val){
			if(in_array($month, $val)){
				return $key;
			}
		}
		return false;
	}
 
SVTerziev каза:
http://biostall.com/get-the-current-season-using-php ?
Гледах го но не е никак никак опростено. Затова дадох моят код и обясних, че искам да го опростя като добавя и примерно по дата ли ще го изчислява прочие и аз незнам...
 
Като за начало трябва да съобразиш, че
$northern[x] == $southern[(x+2)%4]
Можеш да използваш два масива - един $seasons, който държи само имената на сезоните, и един $months, който държи месеците за съотв. сезон.
$seasons = ['пролет','лято','есен'];
$months = [ [1,2,3], [4,5,6]];
Да приемем, че $months е подреден като $northern. Тогава в цикъла минаваш през месеците, проверяваш дали търсеният месец попада в текущия масив. Ако "да", проверяваш за $hemisphere - ако е southern добавяш 2 към върнатия месец и правиш %4 (за да не превишаваш 4-тия сезон)

PHP:
foreach ($months as $i => $arr) {
    if (in_array($month, $arr)) {
        if ($hemisphere == 'southern')
            return $seasons[($i+2)%4];
        return $seasons[$i];
    }
}

Малко по-сбито:
PHP:
$seasons = ['пролет', 'лято', 'есен', 'зима'];
$months = [ [3,4,5], [6,7,8], [9,10,11], [12,1,2] ];
foreach ($months as $i => $arr)
    if (in_array($month, $arr))
        return $hemisphere == 'southern' ? 
            $seasons[($i+2)%4] : $seasons[$i];

И цялата функция става на 6 реда :)

п.п А сега ми хрумна, че може просто да записваш първия месец от пролетта и с малко +-*/ ще изкараш сезона без цикъл... но това за утре :wink:
 
Това е така! А как да добавя и дните примерно да е по-точно изчислението и делението в месеца?
 
dakata__92 каза:
Това е така! А как да добавя и дните примерно да е по-точно изчислението и делението в месеца?
Какво по-точно имаш предвид? Да брои от 21ви (или 22-ри беше?) март да е пролет, а преди това зима? Че това е елементарно! :lol:
Просто в параметрите добавяш $day и в началото на ф-ята правиш една бърза проверка:
PHP:
if ($day < 22 && $month % 3 == 0)
    $month--;
Очевидно е ;D или друго питаш ??
 
anonimen каза:
dakata__92 каза:
Това е така! А как да добавя и дните примерно да е по-точно изчислението и делението в месеца?
Какво по-точно имаш предвид? Да брои от 21ви (или 22-ри беше?) март да е пролет, а преди това зима? Че това е елементарно! :lol:
Просто в параметрите добавяш $day и в началото на ф-ята правиш една бърза проверка:
PHP:
if ($day < 22 && $month % 3 == 0)
    $month--;
Очевидно е ;D или друго питаш ??
Да това искам но проблема е при смяна на полукълбата и въпросното ногождоне на дните от месеците. Има разлики но в момента не съм в кондиция да ги забележа... Стават няколко if-а и не е много лошо но кодът за който се сещам еее много дълго решение... Сам виждаш как си драснах първоначалният метод. :)
 
PHP:
public function getSeason($month,$day,$hemisphere="northern") {

if ($day < 22 && $month % 3 == 0)
    $month--; 
$seasons = ['пролет', 'лято', 'есен', 'зима'];
$months = [ [3,4,5], [6,7,8], [9,10,11], [12,1,2] ];
foreach ($months as $i => $arr)
    if (in_array($month, $arr))
        return $hemisphere == 'southern' ? 
            $seasons[($i+2)%4] : $seasons[$i];

}
Къде има проблем?
Идеята на намаляването на месеца е да накарам да смята 10 март като февруари, защото февруари е зима, а март - пролет. За какво "нагаждане на дните" говориш?
 
anonimen каза:
PHP:
public function getSeason($month,$day,$hemisphere="northern") {

if ($day < 22 && $month % 3 == 0)
    $month--; 
$seasons = ['пролет', 'лято', 'есен', 'зима'];
$months = [ [3,4,5], [6,7,8], [9,10,11], [12,1,2] ];
foreach ($months as $i => $arr)
    if (in_array($month, $arr))
        return $hemisphere == 'southern' ? 
            $seasons[($i+2)%4] : $seasons[$i];

}
Къде има проблем?
Идеята на намаляването на месеца е да накарам да смята 10 март като февруари, защото февруари е зима, а март - пролет. За какво "нагаждане на дните" говориш?
Северно полукълбо:
Пролет 21,03-21,06
Лято 21,06-23,09
Есен 23,09-21,12
Зима 21,12-21,03
Ако не се лъжа има и някакви разлики. Схванах от идеята кода ти и благодаря че се занимаваш с мен заслужи си +1 в края на темата просто само да дооправя нещата да са по-точни. За Южното не се сещам в момента как са само предполагам от формулата която ми даде по-нагоре.
 
Ето на какво попаднах аз:
PHP:
function getSeason($dateToCheck) {
   $seasonDates = array('/12/21'=>'Зима',
                        '/09/21'=>'Есен',
                        '/06/21'=>'Лято',
                        '/03/21'=>'Пролет',
                        '/01/01'=>'Зима');
    $date = new DateTime($dateToCheck);
    $formatDate = date_format($date, 'd-m-Y');

    foreach ($seasonDates AS $key => $value) {
        $seasonDate = date("Y").$key;
        if (strtotime($formatDate) >= strtotime($seasonDate)) {
            return $value;
        }
    }
}
 

Back
Горе