За последние 24 часа нас посетили 20006 программистов и 1001 робот. Сейчас ищут 332 программиста ...

Практические задания по PHP

Тема в разделе "PHP для новичков", создана пользователем 4akHopic, 4 апр 2019.

  1. 4akHopic

    4akHopic Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    46
    Симпатии:
    1
    Начал изучать php. Решаю разные задачи с задачнике. По мере выполнения буду добавлять их в эту тему. Просьба указать на правильность решения, возможные поправки. Спасибо
    --- Добавлено ---
    Напишите скрипт, который будет находить корни квадратного уравнения. Для этого сделайте 3 инпута, в которые будут вводиться коэффициенты уравнения.

    PHP:
    1. <?php
    2. if (isset($_POST['sub'])) {
    3.   function sqrFunction($a,$b,$c = 0)
    4.   {
    5.     $x1 = 0;
    6.     $x2 = 0;
    7.     $d = ($b*$b) - (4*$a*$c);
    8.     if($d > 0){
    9.       $x1 = ((-$b) - sqrt($d))/2*$a;
    10.       $x2 = ((-$b) + sqrt($d))/2*$a;
    11.       echo 'X1 = '. $x1 . '<br>';
    12.       echo 'X2 = '.$x2 . '<br>';
    13.     }
    14.     elseif($d == 0) {
    15.       $x2 = ((-$b) + sqrt($d))/2*$a;
    16.       echo 'X1 = '.$x2 . '<br>';
    17.     }else {
    18.       echo "D = $d < 0, уравнение не имеет действительных корней";
    19.     }
    20.   }
    21.   if(isset($_POST['a']) and isset($_POST['b']) and isset($_POST['c'])) {
    22.     $a = $_POST['a'];
    23.     $b = $_POST['b'];
    24.     $c = $_POST['c'];
    25. echo sqrFunction($a,$b,$c);
    26. }
    27. }else{
    28. ?>
    29. <form action="" method="post">
    30.   <p>Введите a: <input required="" type="number" name="a"></p>
    31.   <p>Введите b: <input required="" type="number" name="b"></p>
    32.   <p>Введите c: <input required="" type="number" name="c" value="0"></p>
    33.   <input type="submit" name="sub">
    34.   <input type="reset">
    35. </form>
    36. <?php
    37. }
    38. ?>
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    В новичках эта тема полезнее будет, и быстрее откликнутся. Ну ничего код, в принципе. Можно придраться, что на сервере не проверяешь, то ли тебе прислали, и не проверяешь случаи, если тебе нулевой коэффициент введут. К примеру, если a=0 квадратное уравнение вырождается в линейное.

    И в реальной жизни обработчик POST ничего не выводит, а делает редирект, но тут не страшно, что нету редиректа, в принципе, сойдёт.

    С операцией and поосторожнее, там запара с приоритетами, лучше писать сишный вариант &&.

    Хвалю, редкий тут человек, который учится программированию на правильных задачах, а не пытается сразу ваять соц. сети.

    Функцию нахождения решения я бы вынес из под if-a. И лучше переписать её так, чтоб она возвращала корни, а не выводила их сама. Хороший тон в программировании. Так, если тебе в другой программе потребуется найти корни и что-то с ними сделать, ты сможешь перенести туда эту функцию без изменений и использовать повторно, а в текущем варианте придётся модифицировать.
     
    4akHopic нравится это.
  3. 4akHopic

    4akHopic Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    46
    Симпатии:
    1
    Спасибо за придирки. Немного помучился с глобальной переменной $_SERVER['SCRIPT_NAME'] но всьо Ок.

    PHP:
    1. <?php
    2. if (!isset($_REQUEST['sub'])) {
    3.   ?>
    4. <form action="<?=$_SERVER['SCRIPT_NAME']?>">
    5.    <p>Введите A: <input required="" type="number" name="a"></p>
    6.    <p>Введите B: <input required="" type="number" name="b"></p>
    7.    <p>Введите C: <input required="" type="number" name="c" value="0"></p>
    8.    <input type="submit" name="sub">
    9.    <input type="reset">
    10. </form>
    11. <?php
    12. }
    13. else{
    14.  
    15.   function sqrFunction($a,$b,$c = 0)
    16.   {
    17.     $x1 = 0;
    18.     $x2 = 0;
    19.     $d = ($b*$b) - (4*$a*$c);
    20.     if($d > 0){
    21.       $x1 = ((-$b) - sqrt($d))/2*$a;
    22.       $x2 = ((-$b) + sqrt($d))/2*$a;
    23.       echo 'X1 = '. $x1 . '<br>';
    24.       echo 'X2 = '.$x2 . '<br>';
    25.     }
    26.     elseif($d == 0) {
    27.       $x2 = ((-$b) + sqrt($d))/2*$a;
    28.       echo 'X1 = '.$x2 . '<br>';
    29.     }else {
    30.       echo "D = $d < 0, уравнение не имеет действительных корней";
    31.     }
    32.   }
    33.  
    34.   if(isset($_REQUEST['a']) && isset($_REQUEST['b']) && isset($_REQUEST['c'])) {
    35.     $a = $_REQUEST['a'];
    36.     $b = $_REQUEST['b'];
    37.     $c = $_REQUEST['c'];
    38.     if ($a != 0) {
    39.       echo sqrFunction($a,$b,$c);
    40.     }else {
    41.      echo "Коэффициент A = 0 <br>";
    42.     }
    43.   }
    44. }
     
    #3 4akHopic, 4 апр 2019
    Последнее редактирование: 4 апр 2019
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Ты про массивы уже читал? Сделай всё-таки, чтоб функция нахождения корней занималась своим делом, т.е. находила корни, а не выводила их. Приучайся задачу делить на как можно более изолированные друг от друга части, в будущем пригодится.
    --- Добавлено ---
    Вернуть можно в массиве все корни. Если массивы пока не знаешь, отметь где-нибудь, вернись к задаче, когда прочитаешь про них.
    --- Добавлено ---
    Оба, а вот это-то неверно. Формула-то выглядит так:
    upload_2019-4-4_15-23-45.png
    А твой код a переместил в числитель (у деления и умножения одинаковый приоритет, поэтому код выполнится слева направо, сначала поделит на 2, потом умножит на a. Так что додумай сам, как исправить. И проверил бы, не так сложно руками решить квадратное уравнение.
     
  5. 4akHopic

    4akHopic Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    46
    Симпатии:
    1
    Исправил. Если я правильно понял то код решения будет такой:

    PHP:
    1. <?php
    2. if (!isset($_REQUEST['sub'])) {
    3.   ?>
    4. <form action="<?=$_SERVER['SCRIPT_NAME']?>">
    5.    <p>Введите A: <input required="" type="number" name="a"></p>
    6.    <p>Введите B: <input required="" type="number" name="b"></p>
    7.    <p>Введите C: <input required="" type="number" name="c" value="0"></p>
    8.    <input type="submit" name="sub">
    9.    <input type="reset">
    10. </form>
    11. <?php
    12. }
    13. else{
    14.  
    15.   function oneX($a,$b,$c = 0,$d){
    16.     $var1 = ((-$b) - sqrt($d))/(2*$a);
    17.     $var2 = ((-$b) + sqrt($d))/(2*$a);
    18.     return array($var1, $var2);
    19.   }
    20.  
    21.   if(isset($_REQUEST['a']) && isset($_REQUEST['b']) && isset($_REQUEST['c'])) {
    22.     $a = $_REQUEST['a'];
    23.     $b = $_REQUEST['b'];
    24.     $c = $_REQUEST['c'];
    25.     if ($a != 0) {
    26.       $d = ($b*$b) - (4*$a*$c);
    27.       if($d > 0){
    28.         list($x1,$x2) = oneX($a,$b,$c,$d);
    29.         echo 'X1 = '. $x1 . '<br>';
    30.         echo 'X2 = '. $x2 . '<br>';
    31.       }
    32.       elseif($d == 0) {
    33.         list($x2)=oneX($a,$b,$c,$d);
    34.         echo 'X1 = '. $x2 . '<br>';
    35.       }else {
    36.         echo "D = $d < 0, уравнение не имеет действительных корней";
    37.       }
    38.     }else {
    39.       echo "Коэффициент A = 0 <br>";
    40.     }
    41.   }
    42. }
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    ОК, лучше. Но лично я бы сделал, чтоб функция возвращала массив, если корня два, число - если корень один, и null - если корней нет. И дискриминанта, конечно, должна считаться внутри функции, а не отдельно. Т.е. мне бы хотелось функцию, в которую бы я передал a, b и с, а она дала результат. Я не хочу считать дискриминанту руками. Вообще, когда пишешь функцию, смотри на неё с точки зрения другого человека. Т.е. так, я вызываю функцию, но мне надо самому считать дискриминанту. Что-то я бы матюкнулся на этого программиста :)

    Какой версией php пользуешься? Сейчас есть ** для возведения в степень, краткий синтаксис для массивов [].
     
  7. 4akHopic

    4akHopic Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    46
    Симпатии:
    1
    php 7.3.3
    Я так сразу и думал сделать. Но
    Я не верно тебя понял, и не переспросил, подумал функция должна возвращать только корни o_O

    PHP:
    1. <?php
    2. if (!isset($_REQUEST['sub'])) {
    3.   ?>
    4. <form action="<?=$_SERVER['SCRIPT_NAME']?>">
    5.    <p>Введите A: <input required="" type="number" name="a"></p>
    6.    <p>Введите B: <input required="" type="number" name="b"></p>
    7.    <p>Введите C: <input required="" type="number" name="c" value="0"></p>
    8.    <input type="submit" name="sub">
    9.    <input type="reset">
    10. </form>
    11. <?php
    12. }
    13. else{
    14.  
    15.   function oneX($a,$b,$c = 0){
    16.     $d = ($b*$b) - (4*$a*$c);
    17.     $var1 = ((-$b) - sqrt($d))/(2*$a);
    18.     $var2 = ((-$b) + sqrt($d))/(2*$a);
    19.     return array($var1, $var2, $d);
    20.   }
    21.  
    22.   if(isset($_REQUEST['a']) && isset($_REQUEST['b']) && isset($_REQUEST['c'])) {
    23.     $a = $_REQUEST['a'];
    24.     $b = $_REQUEST['b'];
    25.     $c = $_REQUEST['c'];
    26.     if ($a != 0) {
    27.       list($x1,$x2,$d) = oneX($a,$b,$c);
    28.       if($d > 0){
    29.         echo 'X1 = '. $x1 . '<br>';
    30.         echo 'X2 = '. $x2 . '<br>';
    31.       }
    32.       elseif($d == 0) {
    33.         echo 'X1 = '. $x2 . '<br>';
    34.       }else {
    35.         echo "D = $d < 0, уравнение не имеет действительных корней";
    36.       }
    37.     }else {
    38.       echo "Коэффициент A = 0 <br>";
    39.     }
    40.   }
    41. }
     
    #7 4akHopic, 4 апр 2019
    Последнее редактирование: 4 апр 2019
  8. 4akHopic

    4akHopic Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    46
    Симпатии:
    1
    Даны 3 селекта и кнопка. Первый селект - это дни от 1 до 31, второй селект - это месяцы от января до декабря, а третий - это годы от
    1990 до 2025. С помощью этих селектов можно выбрать дату. По нажатию на кнопку выведите на экран день недели, соответствующий этой дате, например, 'воскресенье'.

    Как решить проблему если в месяце нет 31 дня? Через if-и ?

    PHP:
    1. <?php
    2. $d = range(1,31);
    3. $m = range(1,12);
    4. $y = range(1990,2025);
    5.  
    6. function selectD($c){
    7.   foreach ($c as $key => $value) {
    8.   echo '<option value="'.$value.'">'. $value.'</option>';
    9.     }
    10.   }
    11.  
    12. if (!isset($_REQUEST['sub'])) {
    13. ?>
    14.  
    15. <form action="<?=$_SERVER['SCRIPT_NAME']?>">
    16.   <p>Выберете дату: </p>
    17.   <a>День: </a>
    18.   <select name="day[]">
    19.     <?php selectD($d) ?>
    20.   </select>
    21.  
    22.   <a>Месяц: </a>
    23.   <select name="month[]">
    24.     <?php selectD($m) ?>
    25.   </select>
    26.  
    27.   <a>Год: </a>
    28.   <select name="year[]">
    29.     <?php selectD($y) ?>
    30.   </select>
    31.   <input type="submit" name="sub">
    32. </form>
    33. <?php }
    34. else{
    35.     $day = $_REQUEST['day'];
    36.     $month = $_REQUEST['month'];
    37.     $year = $_REQUEST['year'];
    38.     $week = ['Воскресенье', 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота'];
    39.     $x = date('w', mktime(0,0,0,$month[0],$day[0],$year[0]));
    40.     print_r($week[$x]);
    41. }?>
     
  9. 4akHopic

    4akHopic Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    46
    Симпатии:
    1
    Немного переработал

    PHP:
    1. <?php
    2. $d = range(1,31);
    3. $m = range(1,12);
    4. $y = range(1990,2025);
    5.  
    6. function selectD($arr,$a,$sel){
    7.  
    8.   echo '<a>'. $a .'</a>';
    9.   echo '<select name="'. $sel . '">';
    10.   foreach ($arr as $key => $value) {
    11.   echo '<option value="'.$value.'">'. $value.'</option>';
    12.     }
    13.   echo '</select>';
    14.   }
    15.  
    16. if (!isset($_REQUEST['sub'])) {
    17. ?>
    18.   <form action="<?=$_SERVER['SCRIPT_NAME']?>">
    19.   <p>Выберете дату: </p>
    20.     <?php selectD($d,'День',"day[]");
    21.  
    22.      selectD($m,'Месяц',"month[]");
    23.  
    24.      selectD($y,'Год',"year[]"); ?>
    25.  
    26.     <input type="submit" name="sub">
    27.   </form>
    28. <?php }else{
    29.     $day = $_REQUEST['day'];
    30.     $month = $_REQUEST['month'];
    31.     $year = $_REQUEST['year'];
    32.     $week = ['Воскресенье', 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота'];
    33.     $x = date('w', mktime(0,0,0,$month[0],$day[0],$year[0]));
    34.     print_r($week[$x]);
    35. }?>
    или это перебор построение html в функции?
     
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Ладно. Смотри мастер-класс:
    PHP:
    1. function solveQuadratic($a, $b, $c) {
    2.    $d = $b ** 2 - 4 * $a * $c;
    3.    if ($d < 0) {
    4.        return null;
    5.    }
    6.    if ($d === 0) {
    7.        return (-$b) / (2 * $a);
    8.    }
    9.    return [(-$b - sqrt($d))/(2 * $a), (-$b + sqrt($d))/(2 * $a)];
    10. }
    11.  
    12. $solution = solveQuadratic($_POST["a"], $_POST["b"], $_POST["c"]);
    13. if ($solution === null) {
    14.    echo "Нет корней";
    15. } elseif (!is_array($solution)) {
    16.    echo "Корень $solution";
    17. } else {
    18.    echo "Корни $solution[0], $solution[1]";
    19. }
    (синтаксис php >= 5.6)

    Надеюсь после рабочего дня ничего не напутал :)
    --- Добавлено ---
    Есть такая функция, checkdate, в принципе. Для обучения будет полезно написать самому. Там как раз нужна проверка на месяцы, проверка на високосный год - очень полезная штука. Как, кстати, и вычисление дня недели самому запрограммировать - есть алгоритмы. Я в школе на районной олимпиаде когда-то писал :)

    https://ru.wikihow.com/вычислить-день-недели

    Цель этих заданий - научить тебя мыслить алгоритмически, поэтому готовые функции лучше ограничивать пока.
     
  11. acho

    acho Активный пользователь

    С нами с:
    28 дек 2016
    Сообщения:
    854
    Симпатии:
    210
    Адрес:
    Санкт-Петербург
    Учить пхп сразу с новой версии языка?
    Не соцсеть\игра\стартап, а алгоритмы?
    Пытаться понять правильное решение?

    Если честно, я в шоке. Давно такого не было.
    Кажется, вера в человечество начинает ко мне возвращаться.
     
    4akHopic нравится это.
  12. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Делают так иногда. Для твоего уровня норм. Когда будешь готов к реалу, увидишь, как там делают. Хотя так тоже ещё, иногда.
     
  13. 4akHopic

    4akHopic Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    46
    Симпатии:
    1
    круто буду знать, мне всегда почему то хотелось делать вот так:
    PHP:
    1. $var2 = ((-$b) + sqrt($d))/(2*$a);
    2.     return array($var1, $var2, $d);
    сначала присвоить, после отправить:)


    Человечество я вас - не подведу:)
     
  14. 4akHopic

    4akHopic Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    46
    Симпатии:
    1
    С задания
    Если результат больше 6, то вычтите из него наибольшее число, кратное 7.
    Такое решение подойдет ?:
    PHP:
    1. $b = 44;
    2. $i = 1;
    3. $a = 0;
    4. while ($a <= $b) {
    5.   $a = $i * 7;
    6.   $i++;
    7. }
    8. echo  $b - ($a-7);
     
  15. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Нормально, хотя я бы сделал по-другому:
    PHP:
    1. $b = 44; // предполагается, что это результат расчётов
    2. $d = $b;
    3. while ($d % 7) {
    4.    $d--;
    5. }
    Меньше итераций
     
    4akHopic нравится это.
  16. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    @4akHopic, расскажешь потом, работает алгоритм или нет. Страничку я в поиске нашёл. На олимпиаде я другим методом делал, там в условии было что какой-то там день в каком-то забытом году понедельник, какой - уже не помню.
     
  17. 4akHopic

    4akHopic Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    46
    Симпатии:
    1
    Алгоритм работает, возникла проблема приделать его к предыдущей форме с селектами, а потом распознать и дать на обработку в алгоритм.
    Если делать с инпутами без селекта, по типу - введите сами то нет проблем.


    Код не буду пока выкладывать, там можно голову сломить:D
     
  18. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    А в чём разница? Там придут три числа, и там придут три числа на сервер
     
  19. 4akHopic

    4akHopic Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    46
    Симпатии:
    1
    Как сделать:
    нам пришел
    PHP:
    1. $month2 = $_REQUEST['month2'];
    равен 'Февраль', далее нужно достать из массива $month1 ключ(для дальнейших вычислений). Пробовал array_search но не подходить, у нас есть одинаковые ключи, как вариант сделать вложенный массив ['0'=>['Январь','Октябрь'], '6'=>['Апрель','Июль']]

    PHP:
    1.   $month1 = ['0'=>'Январь', '3'=>'Февраль', '3'=>'Март', '6'=>'Апрель', '1'=>'Май', '4'=>'Июнь', '6'=>'Июль', '2'=>'Август', '5'=>'Сентябрь', '0'=>'Октябрь', '3'=>'Ноябрь', '5'=>'Декабрь'];
     
  20. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Во-первых, почему пришёл "Февраль" а не двойка?
    А во-вторых, ассоциативные массивы тем и хороши, что строки тоже могут быть ключами.

    PHP:
    1. $monthTable = ["Январь" => 0, "Февраль" => 3 /* и т.д. */];
    И потом $monthTable["Январь"] === 0
     
  21. 4akHopic

    4akHopic Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    46
    Симпатии:
    1
    И сотворил он по образу и подобию своему(мне он вообще не нравится но работает):

    PHP:
    1. <?php
    2. $d = range(1,31);
    3. $m = range(1,12);
    4. $month2 = ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'];
    5. $y = range(1990,2025);
    6.  
    7. function selectD($arr,$a,$sel){
    8.  
    9.   echo '<a>'. $a .'</a>';
    10.   echo '<select name="'. $sel . '">';
    11.   foreach ($arr as $key => $value) {
    12.   echo '<option value="'.$value.'">'. $value.'</option>';
    13.     }
    14.   echo '</select>';
    15.   }
    16.  
    17. if (!isset($_REQUEST['sub'])) {
    18. ?>
    19.   <form action="<?=$_SERVER['SCRIPT_NAME']?>">
    20.   <p>Введите дату: </p>
    21.     <?php
    22.     selectD($d,'День',"day[]");
    23.  
    24.      selectD($month2,'Месяц',"month2[]");
    25.  
    26.  
    27.      selectD($y,'Год',"year[]"); ?>
    28.  
    29.     <input type="submit" name="sub">
    30.   </form>
    31. <?php }else{
    32.  
    33.  
    34.  
    35.  
    36.   $day = $_REQUEST['day'];
    37.   $month2 = $_REQUEST['month2'];
    38.   $year = $_REQUEST['year'];
    39.   $day = $day[0];
    40.   $znach = $month2[0];
    41.   $x = 0;
    42.   if (in_array('Февраль', $month2)) {
    43.       $x = 3;
    44.   }
    45.   if (in_array('Март', $month2)) {
    46.       $x = 3;
    47.   }
    48.   if (in_array('Апрель', $month2)) {
    49.       $x = 6;
    50.   }
    51.   if (in_array('Май', $month2)) {
    52.       $x = 1;
    53.   }
    54.   if (in_array('Июнь', $month2)) {
    55.       $x = 4;
    56.   }
    57.   if (in_array('Июль', $month2)) {
    58.       $x = 6;
    59.   }
    60.   if (in_array('Август', $month2)) {
    61.       $x = 2;
    62.   }
    63.   if (in_array('Сентябрь', $month2)) {
    64.       $x = 5;
    65.   }
    66.   if (in_array('Ноябрь', $month2)) {
    67.       $x = 3;
    68.   }
    69.   if (in_array('Декабрь', $month2)) {
    70.       $x = 5;
    71.   }
    72.  
    73. function rizn($k,$num){
    74.     $i = 1;
    75.     $a = 0;
    76.     while ($a <= $k) {
    77.       $a = $i * $num;
    78.       $i++;
    79.     }
    80.     return $k - ($a-$num);
    81.   }
    82.  
    83.   $x1 = $x + $day;
    84.   $arg1 = 7;
    85.   if($x1 >= $arg1){
    86.     $x1 = rizn($x1,$arg1);
    87.   }
    88.  
    89.   $god = $year[0];
    90.   $str = substr($god,2,2);
    91.   $stryear = $str;
    92.   $str2 = floor($str /4);
    93.   $arg2 = 28;
    94.   if($str>=$arg2){
    95.     $str = rizn($str,$arg2);
    96.   }
    97.   $x2 = $str2 + $str;
    98.   if ($god >= 1900 && $god <= 1999) {
    99.     $x2 += 1;
    100.   }
    101.  
    102.   if($stryear != '00'){
    103.     if($stryear % 4 == 0 && ($month2[0] == 0 || $month2[0] == 1))
    104.     $x2 -=1;
    105.   }elseif ($stryear == '00' && $stryear%400 == 0 && ($month2[0] == 0 || $month2[0] == 1)) {
    106.     $x2 -=1;
    107.   }
    108.  
    109.   $result = $x1 + $x2;
    110.   if($result>=$arg1){
    111.     $result = rizn($result,$arg1);
    112.   }
    113.   $dayweek = ['Суббота', 'Воскресенье', 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота'];
    114.   echo '<br>'.'День недели ';
    115.   print_r($dayweek[$result]);
    116.  
    117. }?>
     
  22. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Зачем массивы? Ты же один месяц передаёшь
    --- Добавлено ---
    И чего мои подсказки не используешь?
    --- Добавлено ---
    Но молодец, запрограммировал. Алгоритм прикольный, вообще :)
     
  23. 4akHopic

    4akHopic Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    46
    Симпатии:
    1
    мотаю на ус :) хочу показать свой код, каким он был в моем представлении, но в конечном результате сегодня переделаю с подсказками. Большое спасибо что помогаешь рефакторить)
    функция предназначена для вывода на экран через селект, если не указать массива то не выводит ничего, селект пустой. если ты про этот элемент
    PHP:
    1. "month2[]"
    Только что попробовал выводит, но после: Warning: in_array() expects parameter 2 to be array, string given in C:\Users\..... переделаю без
    PHP:
    1. "month2[]"
     
  24. 4akHopic

    4akHopic Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    46
    Симпатии:
    1
    Результат с поправками
    PHP:
    1. <?php
    2. $d = range(1,31);
    3. $month = ['Январь'=>'0', 'Февраль'=>'3', 'Март'=>'3', 'Апрель'=>'6', 'Май'=>'1', 'Июнь'=>'4', 'Июль'=>'6', 'Август'=>'2', 'Сентябрь'=>'5', 'Октябрь'=>'0', 'Ноябрь'=>'3', 'Декабрь'=>'5'];
    4. $y = range(1990,2025);
    5.  
    6. function selectD($arr,$a,$sel){
    7.  
    8.   echo '<a>'. $a .'</a>';
    9.   echo '<select name="'. $sel . '">';
    10.   foreach ($arr as $key => $value) {
    11.   echo '<option value="'.$value.'">'. $value.'</option>';
    12.     }
    13.   echo '</select>';
    14.   }
    15.  
    16.   function selectMonth($arr,$a,$sel){
    17.  
    18.     echo '<a>'. $a .'</a>';
    19.     echo '<select name="'. $sel . '">';
    20.     foreach ($arr as $key => $value) {
    21.     echo '<option value="'.$key.'">'. $key.'</option>';
    22.       }
    23.     echo '</select>';
    24.     }
    25.  
    26. if (!isset($_REQUEST['sub'])) {
    27. ?>
    28.   <form action="<?=$_SERVER['SCRIPT_NAME']?>">
    29.   <p>Введите дату: </p>
    30.     <?php
    31.     selectD($d,'День',"day");
    32.  
    33.      selectMonth($month,'Месяц',"month");
    34.  
    35.  
    36.      selectD($y,'Год',"year"); ?>
    37.  
    38.     <input type="submit" name="sub">
    39.   </form>
    40. <?php }else{
    41.  
    42.   $day = $_REQUEST['day'];
    43.   $month2 = $_REQUEST['month'];
    44.   $year = $_REQUEST['year'];
    45.   $x = ($month[$month2]);
    46.  
    47. //Функция разницы чисел кратных $num,
    48. // $k = 37, $num = 7, return = 2.
    49. //при содействии mkramer
    50.       function rizn($k,$num){
    51.             $d = $k;
    52.             while ($d % $num) {
    53.                $d--;
    54.             }
    55.             return $k-$d;
    56.       }
    57.  
    58. //первое вычисление
    59.   $x1 = $x + $day;
    60.   $arg1 = 7;
    61.     $x1 = rizn($x1,$arg1);
    62.  
    63. //этот кусок кода не нравится оч много переменных
    64. //2! второе вычисление
    65.   $str = substr($year,2,2);
    66.   $stryear = $str;
    67.   $str2 = floor($str /4);
    68.   $arg2 = 28;
    69.     $str = rizn($str,$arg2);
    70.   $x2 = $str2 + $str;
    71.  
    72. //век. проверка века
    73. //сделано только для века 1900 и 2000,
    74. //если 1900 $x2 += 1 если, 2000 $x2 += 0
    75. //в $y = range(1990,2025); можно добавить больше значений
    76. //пример для наглядности идет цыкл 0,5,3,1,0 и т.д.
    77. if ($year >= 1600 && $year <= 1699) {//
    78.   $x2 += 0;//можно не писать но для наглядности сойдет
    79. }
    80. if ($year >= 1700 && $year <= 1799) {//
    81.   $x2 += 5;//
    82. }
    83. if ($year >= 1800 && $year <= 1899) {//
    84.   $x2 += 3;//
    85. }
    86. if ($year >= 1900 && $year <= 1999) {//
    87.   $x2 += 1;//
    88. }
    89. if ($year >= 2000 && $year <= 2999) {//
    90.   $x2 += 0;//
    91. }
    92. //проверка на высокосный год
    93.   if(($stryear != '00' && $year % 4 == 0 && ($month2 == 'Январь' || $month2 == 'Февраль'))||($stryear == '00' && $year%400 == 0 && ($month2 == 'Январь' || $month2 == 'Февраль'))){
    94.     $x2 -=1;
    95.   }
    96. // 3! конечный результат
    97.   $result = $x1 + $x2;
    98.     $result = rizn($result,$arg1);
    99.  
    100.   $dayweek = ['Суббота', 'Воскресенье', 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница'];
    101.   echo '<br>'.'День недели ';
    102.   print_r($dayweek[$result]);
    103.  
    104. }?>
     
  25. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    По векам там объяснено, как это число вычислить для произвольного века. Хотя, если надоела эта задача, то можешь дальше идти :)