За последние 24 часа нас посетили 44511 программистов и 3000 роботов. Сейчас ищут 1314 программистов ...

Добавление и товара в корзину и удаление

Тема в разделе "PHP для новичков", создана пользователем Dimon2x, 12 апр 2017.

  1. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    Есть такое задание:

    Опишите класс Корзина, в которые можно передавать любой товар. Опишите у корзины нужные свойства и методы. Например метод получения суммы заказа, удаление товара из корзины и т.д.

    Я вообще тут запутался, правильно ли я сделал добавление товара?

    PHP:
    1. <?php
    2. header('Content-Type: text/html; charset=utf-8');
    3.  
    4.  
    5. interface getProduct{
    6.     public function getName();
    7.     public function getPrice();
    8. }
    9.  
    10. interface Basket{
    11.     public function getProduct();
    12.     public function delProduct();
    13. }
    14.  
    15. abstract class Product implements getProduct{
    16.     private $name;
    17.     private $price;
    18.    
    19.     public function __construct($name, $price){
    20.         $this->name = $name;
    21.         $this->price = $price;
    22.     }
    23.    
    24.     public function getName(){
    25.         return $this->name;
    26.     }
    27.     public function getPrice(){
    28.         return $this->price;
    29.     }
    30. }
    31.  
    32. class Tablet extends Product{}
    33.  
    34. class Cart extends Tablet implements Basket{
    35.     public function getProduct(){
    36.         return $this->getName();
    37.     }
    38.     public function delProduct(){
    39.         return $this->getName();
    40.     }
    41.    
    42. }
    43.  
    44. $tablet = new Tablet('Asus', 3000);
    45. $basket = new Cart($tablet->getName(), $tablet->getPrice());
    46.  
    47. echo $basket->getProduct();
     
  2. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    Плохо. Зачем все эти интерфейсы и абстрактный класс ? Не хватает парочки трейтов и генератор в тележке.
    Упростите. У вас в задаче описано две сущности. Сделайте два класса и пляшите от них.
     
  3. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    @Dimon2x, как уже сказали выше, слишком все усложнил.

    Вот одна из возможных реализаций:


    PHP:
    1. namespace cart;
    2.  
    3. class Cart extends \ArrayObject {
    4.     private $totalPrice = 0;
    5.     /**
    6.      *
    7.      * @param product\Product $value
    8.      */
    9.    function append($value) {
    10.        $this->totalPrice += $value->getPrice();
    11.        parent::append($value);
    12.    }
    13.    /**
    14.     *
    15.     * @param int $index
    16.     */
    17.    function offsetUnset($index) {
    18.        $this->totalPrice-= $this->offsetGet($index)->getPrice();
    19.        parent::offsetUnset($index);
    20.    }
    21.    
    22. }
    использование:
    PHP:
    1. $cart = new cart\Cart();
    2. $cart->append(new product\Product('d',2000));//добавим продукт
    3. $cart->append(new product\Product('Планшет', 4000));//еще один
    4.  
    5. var_dump($cart);
    6. $cart->offsetUnset(1);//удаление
    7. var_dump($cart);
    --- Добавлено ---
    Эта не конечная реализация, а пример.
     
    Dimon2x нравится это.
  4. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    Я сделал добавление товара в корзину и удаление, но если удалять товар, то удаляться будет всегда первый, как сделать, что бы удалить тот, который нужно?

    PHP:
    1. <?php
    2. abstract class Product{
    3.     public $title;
    4.     public $price;
    5.    
    6.     public function __construct($title, $price){
    7.         $this->title = $title;
    8.         $this->price = $price;
    9.     }
    10. }
    11.  
    12. class Cart{
    13.     public $countPdoduct = [];
    14.    
    15.     public function getProduct($product){
    16.         $addProduct = '';
    17.        
    18.         $addProduct = array_push($this->countPdoduct, $product);
    19.        
    20.         if($addProduct){
    21.             echo 'Товар добавлен в корзину';
    22.         }
    23.     }
    24.    
    25.     public function deleteProduct($product){
    26.         if(in_array($product, $this->countPdoduct)){
    27.             unset($this->countPdoduct[0]);
    28.             echo 'Товар удалён из корзины';
    29.         }
    30.     }
    31.    
    32. }
    33.  
    34. class Planshet extends Product{}
    35.  
    36. $planshet = new Planshet('Asus', 2000);
    37.  
    38. $korzina = new Cart();
    39.  
    40. echo '<pre>';
    41. var_dump($korzina->countPdoduct);
    42. echo '</pre>';
    43.  
    44.  
    45. $korzina->getProduct($planshet); //добавляю товар в корзину
    46.  
    47. echo '<pre>';
    48. var_dump($korzina->countPdoduct);
    49. echo '</pre>';
    50.  
    51. $korzina->deleteProduct($planshet); //удаляю из корзины
    52.  
    53. echo '<pre>';
    54. var_dump($korzina->countPdoduct);
     
  5. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    Сделал изменения, совпадения есть, но почему не удаляет?

    PHP:
    1. class Cart{
    2.     public $countPdoduct = [];
    3.    
    4.     public function getProduct($product){
    5.         $addProduct = '';
    6.        
    7.         $addProduct = $this->countPdoduct[$product->title] = $product;
    8.         if($addProduct){
    9.             echo 'Товар добавлен в корзину';
    10.         }
    11.     }
    12.    
    13.     public function deleteProduct($product){
    14.  
    15.         echo key($this->countPdoduct);
    16.         echo '<br>';
    17.         echo $product->title;
    18.        
    19.             if(in_array(key($this->countPdoduct), $this->countPdoduct)){
    20.                 unset($this->countPdoduct[key($this->countPdoduct)]);
    21.                
    22.             echo 'Товар удалён из корзины';
    23.         }  
    24.     }
    25.    
    26. }
     
  6. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    Ну а теперь-то почему не удаляет? ключи выводит, я этот ключ подставляю в массив из которого надо удалить и не удаляется

    PHP:
    1. <?php
    2. abstract class Product{
    3.     public $title;
    4.     public $price;
    5.    
    6.     public function __construct($title, $price){
    7.         $this->title = $title;
    8.         $this->price = $price;
    9.     }
    10. }
    11.  
    12. class Cart{
    13.     public $countProduct = [];
    14.    
    15.     public function getProduct($product){
    16.         $addProduct = '';
    17.        
    18.         $addProduct = $this->countProduct[$product->title] = $product;
    19.         if($addProduct){
    20.             echo 'Товар добавлен в корзину';
    21.         }
    22.     }
    23.    
    24.     public function deleteProduct($product){
    25.        
    26.         foreach($this->countProduct as $key => $value){
    27.             echo $key;
    28.             if(in_array($key, $this->countProduct)){
    29.                 unset($this->countProduct[$key]);
    30.                 echo 'Товар удалён из корзины';
    31.             }  
    32.         }  
    33.     }
    34.    
    35.    
    36. }
    37.  
    38. class Planshet extends Product{}
    39.  
    40. $planshet = new Planshet('Asus', 2000);
    41. $planshet2 = new Planshet('Lenovo', 3000);
    42.  
    43. $korzina = new Cart();
    44.  
    45. echo '<pre>';
    46. var_dump($korzina->countProduct);
    47. echo '</pre>';
    48.  
    49.  
    50. $korzina->getProduct($planshet); //добавляю товар в корзину
    51. $korzina->getProduct($planshet2); //добавляю товар в корзину
    52.  
    53. echo '<pre>';
    54. var_dump($korzina->countProduct);
    55. echo '</pre>';
    56.  
    57. $korzina->deleteProduct($planshet); //удаляю из корзины
    58.  
    59. echo '<pre>';
    60. var_dump($korzina->countProduct);
    --- Добавлено ---
    кстати, если убрать условие, то в цикле заработает удаление, только удалит всё
    --- Добавлено ---
    Я понял, то, что in_array ищет только значения, без ключей, то есть ключи она игнорирует
     
  7. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    У меня получилось :)

    PHP:
    1. <?php
    2. abstract class Product{
    3.     public $title;
    4.     public $price;
    5.    
    6.     public function __construct($title, $price){
    7.         $this->title = $title;
    8.         $this->price = $price;
    9.     }
    10. }
    11.  
    12. class Cart{
    13.     public $countProduct = [];
    14.    
    15.    
    16.     public function getProduct($product){
    17.         $addProduct = '';
    18.        
    19.         $addProduct = $this->countProduct[$product->title] = $product;
    20.         if($addProduct){
    21.             echo 'Товар добавлен в корзину';
    22.         }
    23.     }
    24.    
    25.     public function deleteProduct($product){
    26.        
    27.         echo $product->title;
    28.        
    29.         foreach($this->countProduct as $key => $value){
    30.             if($product->title == $key){
    31.                 unset($this->countProduct[$product->title]);
    32.                 echo 'Товар удалён из корзины';
    33.             }
    34.         }
    35.     }
    36. }
    37.  
    38. class Planshet extends Product{}
    39.  
    40. $planshet = new Planshet('Asus', 2000);
    41. $planshet2 = new Planshet('Lenovo', 3000);
    42.  
    43. $korzina = new Cart();
    44.  
    45. echo '<pre>';
    46. var_dump($korzina->countProduct);
    47. echo '</pre>';
    48.  
    49.  
    50. $korzina->getProduct($planshet); //добавляю товар в корзину
    51. $korzina->getProduct($planshet2); //добавляю товар в корзину
    52.  
    53. echo '<pre>';
    54. var_dump($korzina->countProduct);
    55. echo '</pre>';
    56.  
    57. $korzina->deleteProduct($planshet); //удаляю из корзины
    58.  
    59. echo '<pre>';
    60. var_dump($korzina->countProduct);
     
  8. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    я сделал свойство для счётчика, если добавить такой же товар то количество увеличивается

    PHP:
    1. <?php
    2. abstract class Product{
    3.     public $title;
    4.     public $price;
    5.     public $numberProduct;
    6.    
    7.     public function __construct($title, $price, $numberProduct = 1){
    8.         $this->title = $title;
    9.         $this->price = $price;
    10.         $this->numberProduct = $numberProduct;
    11.     }
    12. }
    13.  
    14. class Cart{
    15.     public $countProduct = [];
    16.    
    17.     public function addProduct($product){
    18.         $getProduct = '';
    19.        
    20.         if(array_key_exists($product->title, $this->countProduct)){
    21.           $this->countProduct[$product->numberProduct++] = $product;
    22.             echo 'Товар добавлен в корзину';
    23.         }
    24.         else{
    25.             $this->countProduct[$product->title] = $product;
    26.             echo 'Товар добавлен в корзину';
    27.         }
    28.        
    29.     }
    30.    
    31.     public function deleteProduct($product){
    32.        
    33.         echo $product->title;
    34.        
    35.         foreach($this->countProduct as $key => $value){
    36.             if($product->title == $key){
    37.                 unset($this->countProduct[$product->title]);
    38.                 echo 'Товар удалён из корзины';
    39.             }
    40.         }
    41.     }
    42. }
    43.  
    44. class Planshet extends Product{}
    45.  
    46. $planshet = new Planshet('Asus', 2000);
    47. $planshet2 = new Planshet('Lenovo', 3000);
    48. $planshet3 = new Planshet('Lenovo', 3000);
    49.  
    50. $korzina = new Cart();
    51.  
    52. echo '<pre>';
    53. var_dump($korzina->countProduct);
    54. echo '</pre>';
    55.  
    56.  
    57. $korzina->addProduct($planshet); //добавляю товар в корзину
    58. $korzina->addProduct($planshet2); //добавляю товар в корзину
    59. $korzina->addProduct($planshet3); //добавляю товар в корзину
    60.  
    61. echo '<pre>';
    62. var_dump($korzina->countProduct);
    63. echo '</pre>';
    64.  
    65. $korzina->deleteProduct($planshet); //удаляю из корзины
    66.  
    67. echo '<pre>';
    68. var_dump($korzina->countProduct);
     
  9. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    А попробуйте ещё больше в ООП. Реализуйте методы, которые вам будут интересны в дальнейшем. Можно ещё Cart заэкстендить от ArrayIterator.
    PHP:
    1. Cart->hasProduct();
    2. Cart->getProduct();
    3. Cart->removeProduct();
    4. Cart->removeAll();
    5. Cart->getAll();
    Добавьте свойство вашему продукту, такое как целочисленное id. И рулите по нему, а не по строковому значению какого-то тайтла.
     
    mahmuzar нравится это.
  10. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    я ввёл количество, но оно почему-то не увеличивается

    PHP:
    1. abstract class Product{
    2.     public $title;
    3.     public $price;
    4.     public $numberProduct;
    5.  
    6.     public function __construct($title, $price, $numberProduct = 1){
    7.         $this->title = $title;
    8.         $this->price = $price;
    9.         $this->numberProduct = $numberProduct;
    10.     }
    11. }
    12.  
    13. class Cart{
    14.     public $countProduct = [];
    15.  
    16.     public function addProduct($product){
    17.         $getProduct = '';
    18.      
    19.         if(array_key_exists($product->title, $this->countProduct)){
    20.          
    21.             $product->numberProduct .= + 1;
    22.             echo 'Товар добавлен в корзину<br>';
    23.         }
    24.         else{
    25.             $this->countProduct[$product->title] = $product;
    26.             echo 'Товар добавлен в корзину<br>';
    27.         }
    28.      
    29.     }
    30.  
    31.     public function deleteProduct($product){
    32.         echo $product->title . ' удалён';
    33.         unset($this->countProduct[$product->title]);
    34.     }
    35. }
    36.  
    37. class Planshet extends Product{}
    38.  
    39. $planshet = new Planshet('Asus', 2000);
    40. $planshet2 = new Planshet('Lenovo', 3000);
    41. $planshet3 = new Planshet('Lenovo', 3000);
    42. $planshet4 = new Planshet('Lenovo', 3000);
    43. $planshet5 = new Planshet('Lenovo', 3000);
    44.  
    45.  
    46. $korzina = new Cart();
    47.  
    48. $korzina->addProduct($planshet); //добавляю товар в корзину
    49. $korzina->addProduct($planshet2); //добавляю товар в корзину
    50. $korzina->addProduct($planshet3); //добавляю товар в корзину
    51. $korzina->addProduct($planshet4); //добавляю товар в корзину
    52. $korzina->addProduct($planshet5); //добавляю товар в корзину
    53.  
    54.  
    55. echo '<pre>';
    56. var_dump($korzina->countProduct);
    57. echo '</pre>';
    58.  
    59. $korzina->deleteProduct($planshet); //удаляю из корзины
    60.  
    61. echo '<pre>';
    62. var_dump($korzina->countProduct);
    --- Добавлено ---
    Так тоже не добавляется
    PHP:
    1. return $product->numberProduct = $product->numberProduct+1;
     
    #10 Dimon2x, 20 апр 2017
    Последнее редактирование модератором: 20 апр 2017
  11. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    Вот такая проблема, количество товаров нормально считает, а вот цену не правильно, если добавить 4 одинаковых товара,

    стоимостью 2000, то должно получится 8000, а получается 16 000, почему?

    И почему не узнаётся цена добавленного товара?

    Я же говорю ей, возьми общую цену у товаров, которые лежат в корзине и добавь к ним цену нового товара, а получается,

    что складывается общая цена и общая цена.

    PHP:
    1. <?php
    2.  
    3. abstract class Product{
    4.     public $title;
    5.     public $price;
    6.     public $numberProduct;
    7.    
    8.     public function __construct($title, $price, $numberProduct = 1){
    9.         $this->title = $title;
    10.         $this->price = $price;
    11.         $this->numberProduct = $numberProduct;
    12.     }
    13. }
    14.  
    15. class Cart{
    16.     public $countProduct = [];
    17.    
    18.     public function addProduct($product){
    19.    
    20.     if(array_key_exists($product->title, $this->countProduct)){ //если такой товар уже есть в корзине
    21.                                                                     //то его количество учеличить на 1
    22.         $this->countProduct[$product->title]->numberProduct++;
    23.        
    24.         $this->countProduct[$product->title]->price += $product->price;
    25.         var_dump($product->price);
    26.            
    27.         echo 'Товар добавлен в корзину<br>';
    28.         echo 'Количество ' . $product->numberProduct . '<br>';
    29.         echo 'Цена ' . $this->countProduct[$product->title]->price . '<br>';
    30.         echo '<br>';
    31.         }
    32.        
    33.         else{ //если нету, то добавить
    34.             $this->countProduct[$product->title] = $product;
    35.             echo 'Товар добавлен в корзину<br>';
    36.             echo '<br>';
    37.         }
    38.     }
    39. }
    40.  
    41. class Planshet extends Product{}
    42.  
    43. $asus = new Planshet('Asus', 2000);
    44.  
    45. $korzina = new Cart();
    46.  
    47. $korzina->addProduct($asus); //добавляю товар в корзину
    48. $korzina->addProduct($asus); //добавляю товар в корзину
    49. $korzina->addProduct($asus); //добавляю товар в корзину
    50. $korzina->addProduct($asus); //добавляю товар в корзину
     
  12. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    Я сделал.

    Создал такие методы:

    1) Добавление продукта.
    2) Добавление одинакового продукта
    3) Удаление одного продукта
    4) Удаление всех продуктов
    5) Получение названия и количество продуктов
    6) Получение общей цены всех продуктов

    PHP:
    1. <?php
    2. abstract class Product{
    3.     public $title;
    4.     public $price;
    5.  
    6.  
    7.     public function __construct($title, $price){
    8.         $this->title = $title;
    9.         $this->price = $price;
    10.     }
    11. }
    12. class Cart{
    13.     public $countProduct = [];
    14.  
    15.     public function addProduct($product){                                    
    16.        $product->numberProduct = 1; //если это убрать то тоже буде работать, только не будет учитывать первый
    17.      
    18.         if(array_key_exists($product->title, $this->countProduct)){
    19.             $this->countProduct[$product->title]->numberProduct++;
    20.        
    21.             echo 'Товар добавлен в корзину<br>';
    22.         }
    23.         else{
    24.             $this->countProduct[$product->title] = $product;
    25.         }
    26.     }
    27.    
    28.     public function deleteAllProduct($product){ //убрать все одинаковые продукты из корщины
    29.         echo $product->title . ' удалён';
    30.         unset($this->countProduct[$product->title]);
    31.     }
    32.    
    33.     public function deleteOneProduct($product){ //убрать 1 одинаковый продукт
    34.         if(array_key_exists($product->title, $this->countProduct)){
    35.        
    36.             if($this->countProduct[$product->title]->numberProduct > 0){
    37.            
    38.                  $this->countProduct[$product->title]->numberProduct--;
    39.                  echo 'Товар ' . $this->countProduct[$product->title]->title. ' удалён из корзины<br>';
    40.             }
    41.         }
    42.     }
    43.  
    44.     public function showAllProduct(){ //показать список продуктов и количество
    45.         $resCountProduct = 0;
    46.        
    47.         foreach($this->countProduct as $key => $value){
    48.             echo 'Товар ' . $key . ', количество: ' . $value->numberProduct . '<br>';
    49.            
    50.             $resCountProduct = $resCountProduct + $value->numberProduct;
    51.            
    52.            
    53.         }
    54.        
    55.         echo 'Общее количество товаров: ' . $resCountProduct;
    56.        
    57.        
    58.         /*
    59.         echo '<pre>';
    60.         var_dump($this->countProduct);
    61.         */
    62.     }
    63.    
    64.     public function sum(){ //подсчитать общую сумму продукта
    65.        
    66.         $res = 0;
    67.         //var_dump($this->countProduct);
    68.        
    69.         foreach($this->countProduct as $key => $value){
    70.             $res = $res + ($value->price * $value->numberProduct);
    71.         }
    72.        
    73.         return $res;
    74.        
    75.     }
    76. }
    77. class Planshet extends Product{}
    78. $asus = new Planshet('Asus', 2000);
    79. $asus2 = new Planshet('Asus', 2000);
    80. $asus3 = new Planshet('Asus', 2000);
    81. $asus4 = new Planshet('Asus', 2000);
    82.  
    83. $lenovo = new Planshet('Lenovo', 3000);
    84. $lenovo3 = new Planshet('Lenovo', 3000);
    85. $korzina = new Cart();
    86. $korzina->addProduct($asus); //добавляю товар в корзину
    87. $korzina->addProduct($asus2); //добавляю товар в корзину
    88. $korzina->addProduct($asus3); //добавляю товар в корзину
    89. $korzina->addProduct($asus4); //добавляю товар в корзину
    90.  
    91. $korzina->addProduct($lenovo); //добавляю товар в корзину
    92. $korzina->addProduct($lenovo3); //добавляю товар в корзину
    93.  
    94.  
    95. //$korzina->deleteOneProduct($asus);
    96. echo '<br>';
    97.  
    98. $korzina->showAllProduct();
    99.  
    100. echo '<br>';
    101. echo '<br>';
    102. echo 'На сумму: ' . $korzina->sum();
     
  13. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    @Abyss, да сразу от ArrayObject, но он не хочет) я ему пример показал.