@BjornBorn

Почему неправильно работает код?

Есть массив гороскопов. Пользователь вводит дату рождения в input и после отправки должен определиться его знак зодиака и выводится предсказание для этого знака на текущий день.

echo '<form action="" method="GET">';
echo '<input type="date" name="birthday">';
echo '<input type="submit" value="отправить">';
echo '</form>';

$horoscopes =
    [
        'Овны' => 'найдите в себе желание радоваться этой жизни, даже если не очень хочется.',
        'Тельцы' => 'сегодня даже работа ответит вам взаимностью.',
        'Близнецы' => 'умерьте аппетиты и не выходите за рамки разумного.',
        'Раки' => 'вы в отличной физической форме и преодолеете все препятствия.',
        'Львы' => 'у вас есть тактика, вот её и придерживайтесь.',
        'Девы' => 'кто-то захочет совершить нападение на ваше сердце.',
        'Весы' => 'настроение будет на высоте, а этого уже достаточно.',
        'Скорпионы' => 'все бонусы этого дня будут поджидать вас вечером.',
        'Стрельцы' => 'наслаждайтесь моментом, а о будущем вы ещё успеете подумать.',
        'Козероги' => 'соблюдайте сегодня максимально дружелюбный вид.',
        'Водолеи' => 'впечатлений, полученых сегодня вам хватит надолго.',
        'Рыбы' => 'звёзды дают зелёный свет на новые знакомства.',
    ];

if (isset($_GET['birthday'])) {
    if ($_GET['birthday'] === '') {
        echo 'Вы не выбрали дату рождения!';
    } else {

        $currentYear = date('Y');

        // Порядковый номер дня рождения в году
        $birthday = (int)date('z', strtotime($_GET['birthday'])) + 1;

        switch ($birthday) {
            case ($birthday >= (int)date('z', mktime(0, 0, 0, 3, 21, $currentYear)) && $birthday <= (int)date('z', mktime(0, 0, 0, 4, 19, $currentYear))):
                echo "Овны: $horoscopes[Овны]";
                break;
            case ($birthday >= (int)date('z', mktime(0, 0, 0, 4, 20, $currentYear)) && $birthday <= (int)date('z', mktime(0, 0, 0, 5, 20, $currentYear))):
                echo "Тельцы: $horoscopes[Тельцы]";
                break;
            case ($birthday >= (int)date('z', mktime(0, 0, 0, 5, 21, $currentYear)) && $birthday <= (int)date('z', mktime(0, 0, 0, 6, 20, $currentYear))):
                echo "Близнецы: $horoscopes[Близнецы]";
                break;
            case ($birthday >= (int)date('z', mktime(0, 0, 0, 6, 21, $currentYear)) && $birthday <= (int)date('z', mktime(0, 0, 0, 7, 22, $currentYear))):
                echo "Раки: $horoscopes[Раки]";
                break;
            case ($birthday >= (int)date('z', mktime(0, 0, 0, 7, 23, $currentYear)) && $birthday <= (int)date('z', mktime(0, 0, 0, 8, 22, $currentYear))):
                echo "Львы: $horoscopes[Львы]";
                break;
            case ($birthday >= (int)date('z', mktime(0, 0, 0, 8, 23, $currentYear)) && $birthday <= (int)date('z', mktime(0, 0, 0, 9, 22, $currentYear))):
                echo "Девы: $horoscopes[Девы]";
                break;
            case ($birthday >= (int)date('z', mktime(0, 0, 0, 9, 23, $currentYear)) && $birthday <= (int)date('z', mktime(0, 0, 0, 10, 22, $currentYear))):
                echo "Весы: $horoscopes[Весы]";
                break;
            case ($birthday >= (int)date('z', mktime(0, 0, 0, 10, 23, $currentYear)) && $birthday <= (int)date('z', mktime(0, 0, 0, 11, 21, $currentYear))):
                echo "Скорпионы: $horoscopes[Скорпионы]";
                break;
            case ($birthday >= (int)date('z', mktime(0, 0, 0, 11, 22, $currentYear)) && $birthday <= (int)date('z', mktime(0, 0, 0, 12, 21, $currentYear))):
                echo "Стрельцы: $horoscopes[Стрельцы]";
                break;
            case ($birthday >= (int)date('z', mktime(0, 0, 0, 12, 22, $currentYear)) && $birthday <= (int)date('z', mktime(0, 0, 0, 1, 19, $currentYear))):
                echo "Козероги: $horoscopes[Козероги]";
                break;
            case ($birthday >= (int)date('z', mktime(0, 0, 0, 1, 20, $currentYear)) && $birthday <= (int)date('z', mktime(0, 0, 0, 2, 18, $currentYear))):
                echo "Водолеи: $horoscopes[Водолеи]";
                break;
            case ($birthday >= (int)date('z', mktime(0, 0, 0, 2, 19, $currentYear)) && $birthday <= (int)date('z', mktime(0, 0, 0, 3, 20, $currentYear))):
                echo "Рыбы: $horoscopes[Рыбы]";
                break;
        }
    }
}


Почему-то ничего не выводит, если вводишь диапазон дат для Козерога.
Для Водолея показывает гороскоп с 19 января по 17 февраля.
Для Рыб с 18 февраля по 20 марта.

P.S. Гороскопы взял с Европы плюс)
  • Вопрос задан
  • 224 просмотра
Пригласить эксперта
Ответы на вопрос 2
pickHabr
@pickHabr
Костыльных дел мастер
Почему-то ничего не выводит, если вводишь диапазон дат для Козерога.

Потому что условие
$birthday >= (int)date('z', mktime(0, 0, 0, 12, 22, $currentYear)) && $birthday <= (int)date('z', mktime(0, 0, 0, 1, 19, $currentYear))
для даты 1991-12-22 будет выглядить так: 358 >= 356 И 358 <= 18

Можно в тупую проверить козерогов в начале года отдельно от козерогов в конце года
case ($birthday >= (int)date('z', mktime(0, 0, 0, 12, 22, $currentYear)) && $birthday <= (int)date('z', mktime(0, 0, 0, 12, 31, $currentYear))):
        echo "Козероги: $horoscopes[Козероги]";
        break;
    case ($birthday >= (int)date('z', mktime(0, 0, 0, 1, 1, $currentYear)) && $birthday <= (int)date('z', mktime(0, 0, 0, 1, 19, $currentYear))):
        echo "Козероги: $horoscopes[Козероги]";
        break;


Еще можно доработать код:
function getZodiacSign($date) {
    $zodiacSigns = [
        ['Козерог', '01-01', '01-19'],
        ['Водолей', '01-20', '02-18'],
        ['Рыбы', '02-19', '03-20'],
        ['Овен', '03-21', '04-19'],
        ['Телец', '04-20', '05-20'],
        ['Близнецы', '05-21', '06-20'],
        ['Рак', '06-21', '07-22'],
        ['Лев', '07-23', '08-22'],
        ['Дева', '08-23', '09-22'],
        ['Весы', '09-23', '10-22'],
        ['Скорпион', '10-23', '11-21'],
        ['Стрелец', '11-22', '12-21'],
        ['Козерог', '12-22', '12-31']
    ];

    $birthDate = date('m-d', strtotime($date));

    foreach ($zodiacSigns as $sign) {
        // Тут 0, 1, 2 не очень хороший код, можешь улучшить его самостоятельно, для примера сойдет
        if ($birthDate >= $sign[1] && $birthDate <= $sign[2]) {
            return $sign[0];
        }
    }

    return null;
}

if (isset($_GET['birthday'])) {
    if ($_GET['birthday'] === '') {
        echo 'Вы не выбрали дату рождения!';
    } else {
        $res = getZodiacSign($_GET['birthday']);
        echo $horoscopes[$res] ?? "error";
    }
}
Ответ написан
Комментировать
Такие простые задачи GPT4 решает быстрей чем вы пишете задачу на тостере.
Просто скопировал ваш
Есть массив гороскопов. Пользователь вводит дату рождения в input и после отправки должен определиться его знак зодиака и выводится предсказание для этого знака на текущий день.

<?php
echo '<form action="" method="GET">';
echo '<input type="date" name="birthday" required>';
echo '<input type="submit" value="Отправить">';
echo '</form>';

$horoscopes = [
    'Овны' => 'найдите в себе желание радоваться этой жизни, даже если не очень хочется.',
    'Тельцы' => 'сегодня даже работа ответит Вам взаимностью.',
    'Близнецы' => 'умерьте аппетиты и не выходите за рамки разумного.',
    'Раки' => 'вы в отличной физической форме и преодолеете все препятствия.',
    'Львы' => 'у Вас есть тактика, вот её и придерживайтесь.',
    'Девы' => 'кто-то захочет совершить нападение на Ваше сердце.',
    'Весы' => 'настроение будет на высоте, а этого уже достаточно.',
    'Скорпионы' => 'все бонусы этого дня будут поджидать Вас вечером.',
    'Стрельцы' => 'наслаждайтесь моментом, а о будущем Вы ещё успеете подумать.',
    'Козероги' => 'соблюдайте сегодня максимально дружелюбный вид.',
    'Водолеи' => 'впечатлений, полученых сегодня Вам хватит надолго.',
    'Рыбы' => 'звёзды дают зелёный свет на новые знакомства.',
];

if (isset($_GET['birthday'])) {
    $birthday = new DateTime($_GET['birthday']);
    $monthDay = (int)$birthday->format('md');

    $zodiac = '';
    if ($monthDay >= 321 && $monthDay <= 419) {
        $zodiac = 'Овны';
    } elseif ($monthDay >= 420 && $monthDay <= 520) {
        $zodiac = 'Тельцы';
    } elseif ($monthDay >= 521 && $monthDay <= 620) {
        $zodiac = 'Близнецы';
    } elseif ($monthDay >= 621 && $monthDay <= 722) {
        $zodiac = 'Раки';
    } elseif ($monthDay >= 723 && $monthDay <= 822) {
        $zodiac = 'Львы';
    } elseif ($monthDay >= 823 && $monthDay <= 922) {
        $zodiac = 'Девы';
    } elseif ($monthDay >= 923 && $monthDay <= 1022) {
        $zodiac = 'Весы';
    } elseif ($monthDay >= 1023 && $monthDay <= 1121) {
        $zodiac = 'Скорпионы';
    } elseif ($monthDay >= 1122 && $monthDay <= 1221) {
        $zodiac = 'Стрельцы';
    } elseif ($monthDay >= 1222 || $monthDay <= 119) {
        $zodiac = 'Козероги';
    } elseif ($monthDay >= 120 && $monthDay <= 218) {
        $zodiac = 'Водолеи';
    } elseif ($monthDay >= 219 && $monthDay <= 320) {
        $zodiac = 'Рыбы';
    }

    if ($zodiac) {
        echo "$zodiac: " . $horoscopes[$zodiac];
    } else {
        echo 'Не удалось определить Ваш знак зодиака.';
    }
}
?>
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы