<?php

function getAstroSign($input) {
    $astroSignToStartDate = [
        ['Водолей', '21 Jan'],
        ['Рыбы', '20 Feb'],
        ['Овен', '21 Mar'],
        ['Телец', '21 Apr'],
        ['Близнецы', '22 May'],
        ['Рак', '22 June'],
        ['Лев', '23 July'],
        ['Дева', '22 Aug'],
        ['Весы', '24 Sept'],
        ['Скорпион', '24 Oct'],
        ['Стрелец', '23 Nov'],
        ['Козерог', '23 Dec'],
    ];

    $inputDateTime = new DateTime($input);
    $year = $inputDateTime->format('Y');

    // Проходимся по всем элементам, кроме последнего (его проверять не нужно)
    for ($i = 0; $i < count($astroSignToStartDate) - 1; $i++) {
        $from = new DateTime($astroSignToStartDate[$i][1] . $year);
        $to   = new DateTime($astroSignToStartDate[$i + 1][1] . $year);

        if ($inputDateTime < $to && $inputDateTime >= $from) {
            // Возвращаем знак зодиака
            return $astroSignToStartDate[$i][0];
        }
    }

    // Возвращаем "Козерог"
    return end($astroSignToStartDate)[0];
}

$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($input));
}
