Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Скрипт-гороскоп
Форумы портала PHP.SU » » Вопросы новичков » Скрипт-гороскоп

Страниц (1): [1]
 

1. Mandalorian - 17 Сентября, 2021 - 17:30:48 - перейти к сообщению
Здравствуйте! Занимаюсь по онлайн учебнику Трепачев Д.П.
Задача.

Сделайте скрипт-гороскоп. Внутри него хранится массив гороскопов на несколько дней вперед для каждого знака зодиака. По заходу на страницу спросите у пользователя дату рождения, определите его знак зодиака и выведите предсказание для этого знака зодиака на текущий день.

Написал код такого плана.

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. ini_set('error_reporting', E_ALL);
  4. ini_set('display_errors', 1);
  5. ini_set('display_startup_errors', 1);
  6.    
  7. if (empty($_GET)){
  8. ?>
  9.  
  10. <form action="" method="GET">
  11. <input name="birth" placeholder="dd.mm.yyyy">
  12. <input type="submit">
  13. </form>
  14.  
  15. <?PHP
  16. } else {
  17.  
  18. $date = $_GET['birth'];
  19. $arrDate = explode('.', $date);
  20. $dateStamp = mktime(0,0,0,$arrDate[1],$arrDate[0],date('Y'));
  21.  
  22. $today = date('d');
  23. $tommorow = date('d')+1;
  24.  
  25. $horoscope = [
  26.         'Овен'=>[$today=>'гороскоп Овна на Сегодня',$tommorow=>'гороскоп Овна на Завтра'],
  27.         'Телец'=>[$today=>'гороскоп Тельца на Сегодня',$tommorow=>'гороскоп Тельца на Завтра'],
  28.         'Близнецы'=>[$today=>'гороскоп Близнецов на Сегодня',$tommorow=>'гороскоп Близнецов на Завтра'],
  29.         'Рак'=>[$today=>'гороскоп Рака на Сегодня',$tommorow=>'гороскоп Рака на Завтра'],
  30.         'Лев'=>[$today=>'гороскоп Льва на Сегодня',$tommorow=>'гороскоп Льва на Завтра'],
  31.         'Дева'=>[$today=>'гороскоп Девы на Сегодня',$tommorow=>'гороскоп Девы на Завтра'],
  32.         'Весы'=>[$today=>'гороскоп Весов на Сегодня',$tommorow=>'гороскоп Весов на Завтра'],
  33.         'Скорпион'=>[$today=>'гороскоп Скорпиона на Сегодня',$tommorow=>'гороскоп Скорпиона на Завтра'],
  34.         'Стрелец'=>[$today=>'гороскоп Стрельца на Сегодня',$tommorow=>'гороскоп Стрельца на Завтра'],
  35.         'Козерог'=>[$today=>'гороскоп Козерога на Сегодня',$tommorow=>'гороскоп Козерога на Завтра'],
  36.         'Водолей'=>[$today=>'гороскоп Водолея на Сегодня',$tommorow=>'гороскоп Водолея на Завтра'],
  37.         'Рыбы'=>[$today=>'гороскоп Рыб на Сегодня',$tommorow=>'гороскоп Рыб на Завтра'],
  38. ];
  39.  
  40. $zodiacs = [
  41.         'Овен'=>[2103, 1904],
  42.         'Телец'=>[2004, 2005],
  43.         'Близнецы'=>[2105, 2006],
  44.         'Рак'=>[2106, 2207],
  45.         'Лев'=>[2307, 2208],
  46.         'Дева'=>[2308, 2209],
  47.         'Весы'=>[2309, 2210],
  48.         'Скорпион'=>[2310, 2111],
  49.         'Стрелец'=>[2211, 2112],
  50.         'Козерог'=>[2212, 1901],
  51.         'Водолей'=>[2001, 1802],
  52.         'Рыбы'=>[1902, 2003],
  53. ];
  54.  
  55.  
  56.  
  57. foreach($zodiacs as $key=>$sign) {
  58.         foreach($sign as $date) {
  59.                 $res = str_split($date, 2);
  60.                 $zodiacs[$key][] = mktime(0,0,0,$res[1], $res[0], date('Y'));   // третьим и четвертым элементом массива записываю временные рамки знака в формате Timestamp
  61.                 }
  62.         if ($dateStamp > $zodiacs[$key][2] && $dateStamp < $zodiacs[$key][3]) {  // здесь соответственно сравниваю дату рождения и временные рамки знака
  63.                 print_r ("$key<br>");
  64.                 print_r ("$horoscope[$key][$today]<br>");
  65.         }
  66.     }
  67. }
  68. ?>
  69.  


Старался делать с учетом уже пройденного материала, чтоб не слишком сложно было.

Интерестно услышать мнения на счет кода. Может можно что-то улучшить? Или проще написать. Или вобще по другому надо... По интернету посмотрел решения другие, и чего-то не легли на душу. Решил по своей логике попробовать.
2. Vladimir Kheifets - 19 Сентября, 2021 - 13:00:35 - перейти к сообщению
quote=Mandalorian]
...Написал код...
Может можно что-то улучшить? Или проще написать. Или вобще по другому надо...[/quote]

Добрый день!
1. Главное, Вам нужно обрать вниминия на

Был такой старый фильм "31 июня".
Так и у Вас получится. Если $today=30, $tommorow=31, а это ошибка.
Исправить можно так
PHP:
скопировать код в буфер обмена
  1. //original date is in format dd.mm.YYYY
  2. $DateTimeToday = $DateTimeTommorow = DateTime::createFromFormat('d.m.Y', $date);
  3. $today = $DateTimeToday->format('d');
  4. $DateTimeTommorow->add(new DateInterval('P1D'));
  5. $tommorow = $DateTimeTommorow->format('d');

Для $tommorow необходимо учитывать не только день, но и месяц и год.
т.е. для 31 июня, $tommorow будет 1 июля, а для 31 декабря ...

2. Лучше не вычислять в цикле текущий год, а определить в начале кода
PHP:
скопировать код в буфер обмена
  1. $Y=date("Y");

3. Лучше заменить
PHP:
скопировать код в буфер обмена
  1. $zodiacs[$key][] = mktime(0,0,0,$res[1], $res[0], date('Y'));
  2. //на
  3. $zodiacs[$key][] = DateTime::createFromFormat('n/j/Y', "{$res[1]}/{$res[0]}/$Y")->getTimestamp();


4. Вы можете добавить в input атрибуты type="date", value, min, max.
CODE (html):
скопировать код в буфер обмена
  1. <input type="date" name="birth" placeholder="dd.mm.yyyy"
  2. value="<?=$_POST['birth'];?>" min="<?=$min;?>" max="<?=$max;?>" >

Если вставите type="date", в современных браузерах будет выплывать календарик.
min, max - фильтр дат.

Удачи!
3. Mandalorian - 20 Сентября, 2021 - 08:11:37 - перейти к сообщению
Большое спасибо!
4. Mandalorian - 20 Сентября, 2021 - 12:59:27 - перейти к сообщению
Я кстати вспомнил. В функцию mktime можно не передавать последним параметром год date('Y'), так как функция берет автоматически год, который сейчас.

По поводу первого вопроса с датами $today и $tommorow нашел еще такой вариант записи:
PHP:
скопировать код в буфер обмена
  1.  
  2. $today = date('d.m.Y');
  3. $tommorow = date('d.m.Y', strtotime("+ 1 day"));
  4.  


Тут уже будет учитываться смена месяца и года.

 

Powered by ExBB FM 1.0 RC1