<?php
function getAstroSign(DateTime $inputDateTime) {
$astroSignToStartDate = [
// Знак зодиака, начало (номер дня)
['Водолей', 21],
['Рыбы', 20],
['Овен', 21],
['Телец', 21],
['Близнецы', 22],
['Рак', 22],
['Лев', 23],
['Дева', 22],
['Весы', 24],
['Скорпион', 24],
['Стрелец', 23],
['Козерог', 23],
];
// Порядковый номер месяца без ведущего нуля
$month = (int) $inputDateTime->format('n');
// Номер дня месяца без ведущего нуля
$day = (int) $inputDateTime->format('j');
// Минус 1 так как индексация в массиве начинается с нуля
list($astro, $startDate) = $astroSignToStartDate[$month - 1]; if ($day < $startDate) {
// PHP не поддерживает негативные индексы для массивов, поэтому приходится извращаться
$index = ($month === 1) ? 11 : $month - 2;
return $astroSignToStartDate[$index][0];
} else {
return $astro;
}
}
$testcases = [
['1999-01-01', 'Козерог'],
['1999-01-20', 'Козерог'],
['1999-01-21', 'Водолей'],
['1999-01-22', 'Водолей'],
['1999-11-11', 'Скорпион'],
['1999-06-25', 'Рак'],
['1999-06-22', 'Рак'],
['1999-12-23', 'Козерог'],
['1999-12-25', 'Козерог'],
['1999-12-31', 'Козерог'],
];
foreach ($testcases as list($input, $expected)) { var_dump("Дата рождения {$input} ожидается: {$expected}, дано: " . getAstroSign
(new DateTime
($input))); }
PD9waHAKCmZ1bmN0aW9uIGdldEFzdHJvU2lnbihEYXRlVGltZSAkaW5wdXREYXRlVGltZSkgewogICAgJGFzdHJvU2lnblRvU3RhcnREYXRlID0gWwogICAgICAgIC8vINCX0L3QsNC6INC30L7QtNC40LDQutCwLCDQvdCw0YfQsNC70L4gKNC90L7QvNC10YAg0LTQvdGPKQogICAgICAgIFsn0JLQvtC00L7Qu9C10LknLCAyMV0sCiAgICAgICAgWyfQoNGL0LHRiycsIDIwXSwKICAgICAgICBbJ9Ce0LLQtdC9JywgMjFdLAogICAgICAgIFsn0KLQtdC70LXRhicsIDIxXSwKICAgICAgICBbJ9CR0LvQuNC30L3QtdGG0YsnLCAyMl0sCiAgICAgICAgWyfQoNCw0LonLCAyMl0sCiAgICAgICAgWyfQm9C10LInLCAyM10sCiAgICAgICAgWyfQlNC10LLQsCcsIDIyXSwKICAgICAgICBbJ9CS0LXRgdGLJywgMjRdLAogICAgICAgIFsn0KHQutC+0YDQv9C40L7QvScsIDI0XSwKICAgICAgICBbJ9Ch0YLRgNC10LvQtdGGJywgMjNdLAogICAgICAgIFsn0JrQvtC30LXRgNC+0LMnLCAyM10sCiAgICBdOwogCiAgICAvLyDQn9C+0YDRj9C00LrQvtCy0YvQuSDQvdC+0LzQtdGAINC80LXRgdGP0YbQsCDQsdC10Lcg0LLQtdC00YPRidC10LPQviDQvdGD0LvRjwogICAgJG1vbnRoID0gKGludCkgJGlucHV0RGF0ZVRpbWUtPmZvcm1hdCgnbicpOwogICAgLy8g0J3QvtC80LXRgCDQtNC90Y8g0LzQtdGB0Y/RhtCwINCx0LXQtyDQstC10LTRg9GJ0LXQs9C+INC90YPQu9GPCiAgICAkZGF5ID0gKGludCkgJGlucHV0RGF0ZVRpbWUtPmZvcm1hdCgnaicpOwoKICAgIC8vINCc0LjQvdGD0YEgMSDRgtCw0Log0LrQsNC6INC40L3QtNC10LrRgdCw0YbQuNGPINCyINC80LDRgdGB0LjQstC1INC90LDRh9C40L3QsNC10YLRgdGPINGBINC90YPQu9GPCiAgICBsaXN0KCRhc3RybywgJHN0YXJ0RGF0ZSkgPSAkYXN0cm9TaWduVG9TdGFydERhdGVbJG1vbnRoIC0gMV07CiAgICBpZiAoJGRheSA8ICRzdGFydERhdGUpIHsKICAgICAgICAvLyBQSFAg0L3QtSDQv9C+0LTQtNC10YDQttC40LLQsNC10YIg0L3QtdCz0LDRgtC40LLQvdGL0LUg0LjQvdC00LXQutGB0Ysg0LTQu9GPINC80LDRgdGB0LjQstC+0LIsINC/0L7RjdGC0L7QvNGDINC/0YDQuNGF0L7QtNC40YLRgdGPINC40LfQstGA0LDRidCw0YLRjNGB0Y8KICAgICAgICAkaW5kZXggPSAoJG1vbnRoID09PSAxKSA/IDExIDogJG1vbnRoIC0gMjsKICAgICAgICByZXR1cm4gJGFzdHJvU2lnblRvU3RhcnREYXRlWyRpbmRleF1bMF07CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAkYXN0cm87CiAgICB9Cn0KCgokdGVzdGNhc2VzID0gWwoJWycxOTk5LTAxLTAxJywgJ9Ca0L7Qt9C10YDQvtCzJ10sCglbJzE5OTktMDEtMjAnLCAn0JrQvtC30LXRgNC+0LMnXSwKCVsnMTk5OS0wMS0yMScsICfQktC+0LTQvtC70LXQuSddLAoJWycxOTk5LTAxLTIyJywgJ9CS0L7QtNC+0LvQtdC5J10sCglbJzE5OTktMTEtMTEnLCAn0KHQutC+0YDQv9C40L7QvSddLAoJWycxOTk5LTA2LTI1JywgJ9Cg0LDQuiddLAoJWycxOTk5LTA2LTIyJywgJ9Cg0LDQuiddLAoJWycxOTk5LTEyLTIzJywgJ9Ca0L7Qt9C10YDQvtCzJ10sCiAgICBbJzE5OTktMTItMjUnLCAn0JrQvtC30LXRgNC+0LMnXSwKCVsnMTk5OS0xMi0zMScsICfQmtC+0LfQtdGA0L7QsyddLApdOwogCmZvcmVhY2ggKCR0ZXN0Y2FzZXMgYXMgbGlzdCgkaW5wdXQsICRleHBlY3RlZCkpIHsKICAgIHZhcl9kdW1wKCLQlNCw0YLQsCDRgNC+0LbQtNC10L3QuNGPIHskaW5wdXR9INC+0LbQuNC00LDQtdGC0YHRjzogeyRleHBlY3RlZH0sINC00LDQvdC+OiAiIC4gZ2V0QXN0cm9TaWduKG5ldyBEYXRlVGltZSgkaW5wdXQpKSk7Cn0K