$signsstart = [1=>21, 20, 20, 20, 20, 20, 21, 22, 23, 23, 23, 23];помогло, но 12 месяц все равно не правильно считает. "21, 20, 20, 20, 20, 20, 21, 22, 23, 23, 23, 23" - это числа месяца (они сейчас не правильно расставлены по гороскопу, но сейчас не в этом суть), в последнем коде делается разрыв 12 месяца и 1 - вот так 1222 (22 декабря) до 1231 (31 декабря), и потом 0101 (1 января) до 0119 (19 января), хотя это и один зодиакальный месяц. В этом же коде этого нет и возможно именно это и является причиной некорректного подсчета.  | 
	
		
 Не копируйте код как есть, то есть выбрасывайте из него необдуманное, и тогда проблем меньше будет. 
	Функция strtotime преобразовывает дату в штамп времени, и как при этом она будет написана, дд.мм.гггг или дд-мм-гггг, или гггг.мм.дд, или гггг-мм-дд, или еще как либо, это не важно. Данная функция также корректно преобразует и английскую нотацию в метку времени. Вот это $day = str_replace("-","",substr($data,5)); выбросить заменив на: 
$date = date_parse($date);
    if(!$date['errors']) {
        $day = $date['month'] . $date['day'];
        //дальше по коду
    }
Не копируйте код, читайте о функциях.  | 
| Часовой пояс GMT +3, время: 05:20. |