fork download
  1. <?php
  2.  
  3. function getAstroSign(DateTime $inputDateTime) {
  4. $astroSignToStartDate = [
  5. // Знак зодиака, начало (номер дня)
  6. ['Водолей', 21],
  7. ['Рыбы', 20],
  8. ['Овен', 21],
  9. ['Телец', 21],
  10. ['Близнецы', 22],
  11. ['Рак', 22],
  12. ['Лев', 23],
  13. ['Дева', 22],
  14. ['Весы', 24],
  15. ['Скорпион', 24],
  16. ['Стрелец', 23],
  17. ['Козерог', 23],
  18. ];
  19.  
  20. // Порядковый номер месяца без ведущего нуля
  21. $month = (int) $inputDateTime->format('n');
  22. // Номер дня месяца без ведущего нуля
  23. $day = (int) $inputDateTime->format('j');
  24.  
  25. // Минус 1 так как индексация в массиве начинается с нуля
  26. list($astro, $startDate) = $astroSignToStartDate[$month - 1];
  27. if ($day < $startDate) {
  28. // PHP не поддерживает негативные индексы для массивов, поэтому приходится извращаться
  29. $index = ($month === 1) ? 11 : $month - 2;
  30. return $astroSignToStartDate[$index][0];
  31. } else {
  32. return $astro;
  33. }
  34. }
  35.  
  36.  
  37. $testcases = [
  38. ['1999-01-01', 'Козерог'],
  39. ['1999-01-20', 'Козерог'],
  40. ['1999-01-21', 'Водолей'],
  41. ['1999-01-22', 'Водолей'],
  42. ['1999-11-11', 'Скорпион'],
  43. ['1999-06-25', 'Рак'],
  44. ['1999-06-22', 'Рак'],
  45. ['1999-12-23', 'Козерог'],
  46. ['1999-12-25', 'Козерог'],
  47. ['1999-12-31', 'Козерог'],
  48. ];
  49.  
  50. foreach ($testcases as list($input, $expected)) {
  51. var_dump("Дата рождения {$input} ожидается: {$expected}, дано: " . getAstroSign(new DateTime($input)));
  52. }
  53.  
Success #stdin #stdout 0.01s 52488KB
stdin
Standard input is empty
stdout
string(97) "Дата рождения 1999-01-01 ожидается: Козерог, дано: Козерог"
string(97) "Дата рождения 1999-01-20 ожидается: Козерог, дано: Козерог"
string(97) "Дата рождения 1999-01-21 ожидается: Водолей, дано: Водолей"
string(97) "Дата рождения 1999-01-22 ожидается: Водолей, дано: Водолей"
string(101) "Дата рождения 1999-11-11 ожидается: Скорпион, дано: Скорпион"
string(81) "Дата рождения 1999-06-25 ожидается: Рак, дано: Рак"
string(81) "Дата рождения 1999-06-22 ожидается: Рак, дано: Рак"
string(97) "Дата рождения 1999-12-23 ожидается: Козерог, дано: Козерог"
string(97) "Дата рождения 1999-12-25 ожидается: Козерог, дано: Козерог"
string(97) "Дата рождения 1999-12-31 ожидается: Козерог, дано: Козерог"