За последние 24 часа нас посетили 21833 программиста и 1017 роботов. Сейчас ищут 690 программистов ...

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

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

  1. 4akHopic

    4akHopic Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    46
    Симпатии:
    1
    Реализуйте в классе Cart метод remove для удаления продуктов. Метод должен принимать параметром название удаляемого продукта.
    PHP:
    1. <?php
    2. class Product
    3. {
    4.   private $name;
    5.   private $price;
    6.   private $quantity;
    7.  
    8.   public function __construct($name, $price, $quantity)
    9.   {
    10.     $this->name = $name;
    11.     $this->price = $price;
    12.     $this->quantity = $quantity;
    13.   }
    14.  
    15.   public function getCost()
    16.   {
    17.     return $this->price * $this->quantity;
    18.   }
    19.  
    20. }
    21.  
    22. class Cart
    23. {
    24.   private $products = [];
    25.  
    26.   public function add($product)
    27.   {
    28.     $this->products[] = $product;
    29.   }
    30.  
    31.   public function getProduct()
    32.   {
    33.     return $this->products;
    34.   }
    35.  
    36.   public function remove($name)
    37.   {
    38.     foreach ($this->products as $key => $value) {
    39.       print_r(array_keys($this->products[$key], $name));
    40.     }
    41.     }
    42. }
    43.  
    44. $cart = new Cart;
    45. $cart->add(new Product('Banans', '2,99', 10));
    46. $cart->add(new Product('Qiwi', '3,99', 15));
    47. $cart->remove('Banans');
    Хочу организовать удаление с помощью функции unset, но для начала нужно найти ключ с помощью функции array_keys, она ругается на $this->products, Warning: array_keys() expects parameter 1 to be array, object given in.
    Не пойму как удалить элемент? при print_r($cart->getProduct()); Выводит:
    Array ( [0] => Product Object ( [name: Product: private] => Banans [price: Product: private] => 2,99 [quantity: Product: private] => 10 ) [1] => Product Object ( [name: Product: private] => Qiwi [price: Product: private] => 3,99 [quantity: Product: private] => 15 ) )
    Как выполнить корректный поиск чтобы добраться к нашему элементу?

    Вариант попроще, взял обычный двумерный массив и с помощью array_keys нашел ключ нашего массива вот что вернула функция print_r 'Array ( [0] => 0 ) Array ( )', вопрос как это подставить в unset?
    PHP:
    1. $arr = [['banans','2,99',15],['qiwi','4,99',10]];
    2. $val = "banans";
    3. foreach ($arr as $key => $value) {
    4.   print_r(array_keys($arr[$key], $val));
    5. }
    Заранее благодарен за помощь.
     
    Fibonachi нравится это.
  2. Fibonachi

    Fibonachi Новичок

    С нами с:
    21 апр 2019
    Сообщения:
    5
    Симпатии:
    0
    Вам нужно пройтись по массиву-результату функции array_keys и по очереди удалить все найденные значения:

    PHP:
    1. <?php
    2. $arr = [['banans','2,99',15],['qiwi','4,99',10]];
    3. $val = "banans";
    4. foreach ($arr as $key => $value) {
    5.     $delete_keys = array_keys($arr[$key], $val);
    6.    
    7.         foreach ($delete_keys as $dkey) {
    8.             unset($arr[$key][$dkey]);
    9.         }
    10. }
    11. print_r($arr);
     
  3. mkramer

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

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

    Fibonachi Новичок

    С нами с:
    21 апр 2019
    Сообщения:
    5
    Симпатии:
    0
    @mkramer я подсказал то, что человек спросил:
    Код, что я написал работает. Проверял перед тем, как написать, поэтому не понимаю твой комментарий.
     
  5. 4akHopic

    4akHopic Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    46
    Симпатии:
    1
    Наткнулся на такую функцию
    PHP:
    1. function object_to_array($data)
    2. {
    3.     if (is_array($data) || is_object($data))
    4.     {
    5.         $result = array();
    6.         foreach ($data as $key => $value)
    7.         {
    8.             $result[$key] = object_to_array($value);
    9.         }
    10.         return $result;
    11.     }
    12.     return $data;
    13. }
    с помощью нее надо преобразовать в массив, удалить а после назад в обект?
    --- Добавлено ---
    А если надо удалить из функции?
    результат работы:
    Array ( [0] => Array ( [1] => 2,99 [2] => 15 ) [1] => Array ( [0] => qiwi [1] => 4,99 [2] => 10 ) )
    а должен быть:
    Array ([1] => Array ( [0] => qiwi [1] => 4,99 [2] => 10 ) )
    нужно удалить ['banans','2,99',15].
     
  6. Fibonachi

    Fibonachi Новичок

    С нами с:
    21 апр 2019
    Сообщения:
    5
    Симпатии:
    0
    @mkramer - похоже ты прав, я видимо неправильно понял суть вопроса.

    @4akHopic Для массива, который ты привел как упрощенный:

    PHP:
    1. $arr = [['banans','2,99',15],['qiwi','4,99',10]];
    2. $val = "banans";
    3. foreach ($arr as $key => $value) {
    4.     if (!empty(array_keys($arr[$key], $val))) {
    5.         unset($arr[$key]);
    6.     }
    7. }
    8. print_r($arr);
    Результат такой, как ты написал.

    Но для объекта это, по идее, не будет работать.
     
  7. 4akHopic

    4akHopic Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    46
    Симпатии:
    1
    PHP:
    1. public function remove($name)
    2.   {
    3.     foreach ($this->products as $key => $value) {
    4.       print_r(array_keys($this->products[$key], $name));
    5.     }
    6.     }
    Мне нужно в public function remove($name), в значение $name передать массив ['banans','2,99',15]?
     
  8. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    @4akHopiс, тебе нужно остановиться и подумать о том, что и как ты пытаешься сделать. И зачем. Пока ты тыкаешься вообще без понимания. Задача простая, написать за тебя эти 3 строчки мне не трудно, однако, для обучения больший толк, если ты поймёшь сам и что делаешь неправильно, и как правильно.

    Напиши мне, кстати, алгоритм действий русским языком для начала. Но только по шагам. Вот по этому образцу:
    1. Дан массив $a = [1, 2, 3, 15, 4];
    2. Пусть $m = 0, $n = 0;
    3. Если $n > count($a) - 1, перейти к 6
    4. если $a[$n] > $m, пусть $m = $a[$n];
    5. Пусть $n = $n + 1
    6. Печатать "Максимальное число = ", $m
    --- Добавлено ---
    (я специально расписал другую задачу)
     
    #58 mkramer, 21 апр 2019
    Последнее редактирование: 21 апр 2019
    4akHopic нравится это.
  9. 4akHopic

    4akHopic Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    46
    Симпатии:
    1
    $this->products это массив с нашими элементами, мы перебираем их пока не найдем нам нужное 'banans', после выводим на экран ключ нашего значения.
     
  10. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    @4akHopic ты видимо написал сообщение раньше, чем я прикрепил образец. По образцу, подробно.
     
  11. 4akHopic

    4akHopic Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    46
    Симпатии:
    1
    Написать алгоритм действий к своему заданию?
    3. Если $n > count($a) перейти к 6 - это не понятно.

    PHP:
    1. <?php
    2. $a = [1,2,3,15,4];
    3. $m = 0;
    4. $n = 0;
    5.  
    6. foreach ($a as $key){
    7.   if ($n>count($a)){
    8.     $m = 6;
    9.   }elseif ($a[$n]>$m)
    10. $m=$a[$n];
    11. $n = $n+1;
    12. }
    13. echo $m;
     
  12. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    @4akHopic, перейти к 6 - значит перейти к 6 пункту. Но я не просил тебя переводить мой алгоритм в php, я просил тебя написать по этому образцу, как ты будешь делать свой. Перевёл, кстати, неверно. Я в принципе расписал, как работает foreach внутри, потому что меня такие алгоритмы учили составлять, не подразумевая циклы существующего языка программирования.
    --- Добавлено ---
    Кстати, касательно этой фигни в целом.
    Расскажи своими словами, зачем нам нужен цикл foreach
     
  13. 4akHopic

    4akHopic Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    46
    Симпатии:
    1
    1. дан массив $arr = [['banans','2,99',15],['qiwi','4,99',10]];
    2. $name = 'banans', $n = 0, $m = 0;
    3. Если count($arr)-1 равен 0 переходим к 9;
    4. если $arr[$n][$m] не равно $name
    5. $arr[$n][$m+1];
    6. если $arr[$n][$m+n] не равно $name;
    7. $arr[$n+1][$m];
    8. если $arr[$n+n][$m+n] не равно $name;
    9. такого елемента нет
    10. echo $arr[$n][$m]

    Нужно ли перебирать $m если я знаю что 'banans' будет на позиции 0: [$n][0] ?
     
  14. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @4akHopic, самое время бросить заниматься хернёй и начать читать книги.
     
  15. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    По условию задачи тебе не такой массив дан.
    А с какого перепуга количество элементов массива будет уменьшаться?
     
  16. 4akHopic

    4akHopic Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    46
    Симпатии:
    1
    а такой?
    Array ( [0] => Product Object ( [name: Product: private] => Banans [price: Product: private] => 2,99 [quantity: Product: private] => 10 ) [1] => Product Object ( [name: Product: private] => Qiwi [price: Product: private] => 3,99 [quantity: Product: private] => 15 ) )
    --- Добавлено ---
    цикл foreach перебирает значения массива
     
  17. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Ответ жутко не полный.
    --- Добавлено ---
    Опиши полностью, что и зачем в этом цикле. Дьявол всегда в мелочах
     
  18. 4akHopic

    4akHopic Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    46
    Симпатии:
    1
    Написал функцию которая по значению $name, записывает нужный нам массив в $arr2.

    PHP:
    1. $arr = [['banans','2,99',15],['qiwi','4,99',10]];
    2. $name = 'qiwi';
    3. $arr2 = [];
    4. foreach ($arr as $key) {
    5.         foreach ($key as $num) {
    6.           if($name == $num){
    7.           $arr2 = $key;
    8.           }
    9.         }
    10. }
    11. var_dump($arr2);
    --- Добавлено ---
    перебирает элементы массива автоматически увеличивая 'счетчик' то есть при каждом проходе в значение $key подставляется следующий элемент.
     
  19. 4akHopic

    4akHopic Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    46
    Симпатии:
    1
    Все работает корректно если установить свойство класса public.
    PHP:
    1.     public function remove($name)
    2.     {
    3.       $n = 0;
    4.       foreach ($this->products as $key) {
    5.               foreach ($key as $num) {
    6.                 if($name == $num){
    7.                   unset($this->products[$n]);
    8.                   sort($this->products);
    9.                 }
    10.               }$n++;
    11.       }
    12.       return $this->products;
    13.     }
     
  20. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    @4akHopic, а нафига ты ищешь совпадения по всем полям, если в задании сказано по имени?
     
  21. 4akHopic

    4akHopic Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    46
    Симпатии:
    1
    Спасибо за подсказку:
    1. Пусть $n = 0;
    2. Пусть $n = $n + 1
    Все работает корректно, даже если установить свойство класса private.

    PHP:
    1. public function remove($name)
    2. {
    3.     $n = 0;
    4.     foreach ($this->products as $product){
    5.     if($name == $product->getProductName()){
    6.       unset($this->products[$n]);
    7.       sort($this->products);
    8.     }
    9.     $n++;
    10.   }
    11. return $this->products;
    12. }
     
  22. 4akHopic

    4akHopic Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    46
    Симпатии:
    1
    Есть такая возможность: явное определение скалярных типов для PHP 7.

    Есть два класса User и User2. Если не указывать типы явно то все работает.
    А если указать вылетает ошибка. Parse error: syntax error, unexpected '$name' (T_VARIABLE), expecting ')' in
    Класс User:
    PHP:
    1. <?php
    2.  
    3. class User
    4. {
    5.   private $name, $age;
    6.  
    7.   public function __construct(string $name, int $age)
    8.   {
    9.   $this->name = $name;
    10.   $this->age = $age;
    11.   }
    12.  
    13.   public function setAge($age)
    14.   {
    15.   $this->age = $age;
    16.   }
    17.  
    18.   public function setName($name)
    19.   {
    20.   $this->name = $name;
    21.   }
    22.  
    23.   public function getAge()
    24.   {
    25.   return $this->age;
    26.   }
    27.  
    28.   public function getName()
    29.   {
    30.   return $this->name;
    31.   }
    32. }
    33. ?>
    Класс User2
    PHP:
    1. <?php
    2. require_once 'User.php';
    3.  
    4. class User2 extends User
    5. {
    6.   private $salary;
    7.  
    8.   public function __construct(string $name, int $age, string $salary)
    9.   {
    10.   parent::__construct(string $name, int $age);
    11.  
    12.   $this->salary = $salary;
    13.   }
    14.  
    15.   public function getSalary()
    16.   {
    17.   return $this->salary;
    18.   }
    19. }
    20. ?>
    Вопрос в следующий, что это такое и как с ним бороться?
    Не указывать типы явно?
     
  23. Emilien

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

    С нами с:
    30 июн 2016
    Сообщения:
    246
    Симпатии:
    156
    В объявлении функций указывать типы допустимо.


    А вот тут уже не объявление, а вызов и это приводит к parse error.
     
    4akHopic нравится это.
  24. 4akHopic

    4akHopic Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    46
    Симпатии:
    1
    Тоже так пробовал, перед тем как запостить, но видимо что то упустил из виду. Все работает спасибо