За последние 24 часа нас посетили 22284 программиста и 1185 роботов. Сейчас ищут 787 программистов ...

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

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

  1. 4akHopic

    4akHopic Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    46
    Симпатии:
    1
    Поправим

    задание которое сделал
    Дан массив:
    PHP:
    1. $arr = [
    2.         ['name'=>'Коля', 'age'=>30, 'salary'=>500],
    3.         ['name'=>'Вася', 'age'=>31, 'salary'=>600],
    4.         ['name'=>'Петя', 'age'=>32, 'salary'=>700],
    5.     ];
    Сделать
    HTML:
    1.     <tr>
    2.         <tr>
    3.             <td>Коля</td>
    4.             <td>30</td>
    5.             <td>500</td>
    6.         </tr>
    7.         <tr>
    8.             <td>Вася</td>
    9.             <td>31</td>
    10.             <td>600</td>
    11.         </tr>
    12.         <tr>
    13.             <td>Петя</td>
    14.             <td>32</td>
    15.             <td>700</td>
    16.         </tr>
    17.     </tr>
    У меня получилось так, нормально? Или как то по другому делают?
    PHP:
    1. $arr = [
    2.         ['name'=>'Коля', 'age'=>30, 'salary'=>500],
    3.         ['name'=>'Вася', 'age'=>31, 'salary'=>600],
    4.         ['name'=>'Петя', 'age'=>32, 'salary'=>700],
    5.     ];
    6. echo '<table>';
    7.   foreach ($arr as $key => $value) {
    8. echo  "<tr>
    9.        <tr>
    10.            <td>{$arr[$key]['name']}</td>
    11.            <td>{$arr[$key]['age']}</td>
    12.            <td>{$arr[$key]['salary']}</td>
    13.        </tr>";
    14.   }
    15. echo '</table>';
     
  2. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    $value['name'] и тд

    Два подряд <tr> это опечатка или фича ? :)
     
    mkramer нравится это.
  3. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    @4akHopic, ну тут обсуждать особо нечего, задание - сколько будет 2+2.

    Единственное, когда выводишь большой кусок HTML, лучше отключать режим php, а потом внутри HTML использовать конструкцию <?= ?>, подготовит тебя к использованию реальных фреймворков без шаблонизатора.
    --- Добавлено ---
    О, и кстати, да, @Valick прав, там уже есть value, зачем ещё раз вычислять? Перечитай foreach
     
  4. 4akHopic

    4akHopic Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    46
    Симпатии:
    1
    еще один не дописал в конце </tr>

    PHP:
    1.  
    2. <?php
    3. $arr = [
    4.   ['name'=>'Коля', 'age'=>30, 'salary'=>500],
    5.   ['name'=>'Вася', 'age'=>31, 'salary'=>600],
    6.   ['name'=>'Петя', 'age'=>32, 'salary'=>700],
    7.   ];?>
    8. <table>
    9. <tr>
    10. <?php  foreach ($arr as $key=>$value) {
    11.   ?>
    12.   <tr>
    13.   <td><?= $value['name'] ?></td>
    14.   <td><?= $value['age'] ?></td>
    15.   <td><?= $value['salary'] ?></td>
    16.   </tr>
    17.   <?php } ?>
    18. </tr>
    19. </table>
     
  5. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @4akHopic, то что не дописал это правильно, а вот когда дописал стало неправильно.
    Посмотрел исходный хтмл, я конечно не верстальщик, но два <tr> подряд сомнительная выгода.
     
  6. 4akHopic

    4akHopic Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    46
    Симпатии:
    1
    по заданию так:
    HTML:
    1.     <tr>
    2.         <tr>
    3.             <td>Коля</td>
    4.             <td>30</td>
    5.             <td>500</td>
    6.         </tr>
    7.         <tr>
    8.             <td>Вася</td>
    9.             <td>31</td>
    10.             <td>600</td>
    11.         </tr>
    12.         <tr>
    13.             <td>Петя</td>
    14.             <td>32</td>
    15.             <td>700</td>
    16.         </tr>
    17.     </tr>
     
  7. 4akHopic

    4akHopic Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    46
    Симпатии:
    1
    Число века можно вычислить, умножив 5 на разность между двумя первыми цифрами года и наибольшего числа, кратного 4 (это число не должно быть больше двух первых цифр года). Например, для 3400: 5 х (34-32) = 10 (от 10 отнимаем 7 и получаем 3).
    Чет не могу разобраться: это число не должно быть больше двух первых цифр года .... Суммы двух первых чисел? или как понимать? или для 34 это 32, для 33-32 для 27 - 24 и т.д.
    от 10 отнимаем 7 и получаем 3 - и откуда мы берем 7, это сумма двух первых чисел?
    наработки есть, но я не разобрался с условием, код не работает как надою
     
  8. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Ну я так понимаю, не должно быть больше числа, составленного из двух первых цифр года.
     
  9. 4akHopic

    4akHopic Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    46
    Симпатии:
    1
    Для 3500 века, результат 7 а должен быть 1
    так будет если от суммы двух первых чисел 8 снова отнять 7
    ручками будет так
    35 - 32 = 3
    3*5=15
    15-8=7
    7<8 оставляем а должно быть 1


    PHP:
    1. <?php
    2. function rizn($k,$num){
    3.       $d = $k;
    4.       while ($d % $num) {
    5.          $d--;
    6.       }
    7.       return $k-$d;
    8. }
    9. $year = '3500';
    10. $strvek = substr($year,0,2);
    11. $sumvek = str_split($strvek, 1);
    12. $sumvek = array_sum($sumvek);
    13. $arg3 = 4;
    14. $strvek = rizn($strvek,$arg3);
    15. $strvek *=5;
    16. if($sumvek>$strvek){
    17.   echo "rezult Strvek = $strvek";
    18. }else{
    19.   $strvek -= $sumvek;
    20.   echo "Else $strvek";
    21. }
     
  10. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Ну может там опечатка какая-то. Думаю, всё что ты мог получить полезного от этой задачи, ты получил :)
     
  11. 4akHopic

    4akHopic Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    46
    Симпатии:
    1
    Работа с файлами и папками. Функция удаления файлов и папок(подпапок)
    Пусть в корне вашего сайта лежит папка dir с текстовыми файлами и подпапками. Удалите папку 'test' вместе с ее содержимым.

    PHP:
    1. removeDir('test');
    2. function removeDir($dir)
    3. {
    4.   $files = array_diff(scandir($dir), ['..', '.']);
    5.   foreach ($files as $file) {
    6.     $patch = $dir . '/' .$file;
    7.     if(is_file($patch)){
    8.       unlink($patch);
    9.     }elseif(is_dir($patch)!== false) {
    10.       removeDir($patch);
    11.     }else {
    12.       rmdir($patch);
    13.     }
    14.   }
    15.   return rmdir($dir);
    16. }
     
  12. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    @4akHopic, что то не так с логикой, по-моему. Расскажи, при каком условии должна выполнится строка 12?
    --- Добавлено ---
    Хотя, вроде она у тебя просто лишняя, а функция всё равно рабочая. Логика есть. ОК, вроде рекурсию соображаешь. Это хорошо. Многие спотыкаются.
     
  13. 4akHopic

    4akHopic Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    46
    Симпатии:
    1
     
  14. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Комментирую твой код:
    Код (Text):
    1.  
    2.  if(is_file($patch)){ // Если файл
    3.       unlink($patch); // удалить файл
    4.     }elseif(is_dir($patch)!== false) { // иначе если папка
    5.       removeDir($patch); // рекурсивно удалить папку
    6.     }else { // иначе (эм, а что это собственно, если и не файл и не папка
    7.       rmdir($patch); // удаляем неизвестно что, как будто это папка
    8.     }
    Т.е. поскольку в папке могут быть или файлы или другие папки последний else никогда не выполнится
     
  15. 4akHopic

    4akHopic Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    46
    Симпатии:
    1
    спасибо, верно говоришь.
    Вчера почему то код что ниже не хотел выполнятся корректно, не удалял саму папку 'test', после я написал еще один else if
    PHP:
    1. elseif(is_dir($patch)!== false) {
    2.       removeDir($patch);
    3.     }else {
    4.       rmdir($patch);
    5.     }
    Но сегодня этот вариант работает корректно в чем секрет мне не известно .

    PHP:
    1. echo removeDir('test');
    2. function removeDir($dir)
    3. {
    4.   if (file_exists($dir)) {
    5.   $files = array_diff(scandir($dir), ['..', '.']);
    6.   foreach ($files as $file) {
    7.     $patch = $dir . '/' .$file;
    8.     if(is_file($patch)){
    9.       unlink($patch);
    10.     }
    11.     else {
    12.       removeDir($patch);
    13.     }
    14.   }
    15.   return rmdir($dir);
    16. }else {
    17.   return  'Папки '. $dir . ' не существует';
    18. }
    19. }
     
  16. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Так делать не надо. Либо человеческий код ошибки верни, либо кинь исключение. Как ты будешь такой возврат отлавливать при вызове?
     
  17. 4akHopic

    4akHopic Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    46
    Симпатии:
    1
    Вместо
    написать return false; ?
     
  18. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Ага, или числовой код. Или throw, когда дойдёшь. Чтоб был простой способ отловить ошибку.
     
  19. 4akHopic

    4akHopic Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    46
    Симпатии:
    1
    Работа с геттерами и сеттерами.
    Есть class Emploee для даты.
    Функция private corectAge() может например где то сохранить значение(private $newage;) если оно прошло проверку, чтобы после введения некорректных данных(private $age;) вернуть нам это значение(private $newage;).
    Мы ввели корректный возраст 18, после 101, вернуть 18 назад можно?

    PHP:
    1. class Emploee
    2. {
    3.   private $age;
    4.  
    5.   public function setAge($age)
    6.   {
    7.     if (corectAge($age)) {
    8.       $this->age = $age;
    9.     }
    10.   }
    11.  
    12.   public function showAge()
    13.   {
    14.     return $this->age;
    15.   }
    16.  
    17.   private function corectAge($age)
    18.   {
    19.     return $age>=1 && $age <= 100;
    20.   }
    21. }
     
  20. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Ну в другом поле. Только мне логика твоя не понятна. В классе сейчас логика, что записывать в поле только правильное значение. А ты что хочешь, и неправильное куда-то писать?
     
  21. 4akHopic

    4akHopic Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    46
    Симпатии:
    1
    Это переработанный добавлено в function corectAge else но это не работает я пробовал несколько вариантов всех не припомню.
    Суть в том если раньше вводилось корректное значение то запомнить его пока не буде введено новое корректное значение.
    сейчас если я ввожу не корректное то оно попросту перезапишет предыдущее в false.

    PHP:
    1. <?php
    2. class Emploee
    3. {
    4.   private $age;
    5.   private $newage
    6.  
    7.   public function setAge($age)
    8.   {
    9.     if (corectAge($age)) {
    10.       $this->age = $age;
    11.     }
    12.   }
    13.  
    14.   public function showAge()
    15.   {
    16.     return $this->age;
    17.   }
    18.  
    19.   private function corectAge($age)
    20.   {
    21.      if($age>=1 && $age <= 100){
    22.     return $age;
    23.      }else{
    24.      return $newage  }
    25.   }
    26. }
    27.  
    28. $user = new Employee;
    29. $user->setAge(45);
    30. $user->showAge();
    31. ?>
    Или добавить if() else() в setAge()

    PHP:
    1. public function setAge($age)
    2.   {
    3. $newage = $this->age;//берем предыдущее значение и присваиваем его $newage
    4. if (corectAge($age)) {
    5.       $this->age = $age;
    6.     }else{
    7. $this->age = $newage//  здесь делаем наоборот если новое значение не прошло проверку
    8.      }
    9. }
    но ни один вариант с тех что я пробовал не работает
     
    #46 4akHopic, 12 апр 2019
    Последнее редактирование: 12 апр 2019
  22. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    @4akHopic, ты в курсе, как работает php? Экземпляр класса существует только в течение одного запроса :) http://phpfaq.ru/na_tanke
     
  23. 4akHopic

    4akHopic Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    46
    Симпатии:
    1
    Я спросить хотел есть какой то метод, или нет, буду знать что нет, значит я условие понял не верно.
    Задача:
    Дополните класс Employee приватным методом isAgeCorrect, который будет проверять возраст на корректность (от 1 до 100 лет). Этот метод должен использоваться в сеттере setAge перед установкой нового возраста (если возраст не корректный - он не должен меняться).
     
  24. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Ну так ты сделал задачу. Если возраст не корректный, он у тебя не меняется. Что тебя не удовлетворяет? Вот этот вариант отвечает задаче:
     
    4akHopic нравится это.
  25. 4akHopic

    4akHopic Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    46
    Симпатии:
    1
    Значит я не верно понял суть задачи, думал так: я ввел 40 это корректно, после 101 это не корректно, значит echo $user->showAge(); должно вывести 40.
    Думаю если сделать через __construct('VAsja',45) а после $user->setAge(101); должно показать echo $user->showAge(); ответ 45 сейчас попробую

    все работает. если сделать public $age то тоже выводит нужный мне результат, извиняюсь за истинно тупой вопрос)))
     
    #50 4akHopic, 12 апр 2019
    Последнее редактирование: 12 апр 2019
  26. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    @4akHopic, не пытайся сделать больше, чем написано в задаче. Там же ни слова про ввод. А если бы было про ввод, кстати, то прочти ссылку. Это уже чуть более сложные механизмы задействовать нужно