Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.04.2017, 13:42
Профессор
Отправить личное сообщение для DivMan Посмотреть профиль Найти все сообщения от DivMan
 
Регистрация: 08.03.2016
Сообщений: 429

Добавление товара в корзину и удаление
Если добавлять одинаковые товары, то по логике свойство numberProduct должно увеличиваться на 1.

Оно увеличивается только 1 раз , но почему-то не сохраняется?

Помогите пожалуйста, я уже 3 часа мучаюсь.

23 строка

<?php

abstract class Product{
	public $title;
    public $price;
	public $numberProduct;
	
	public function __construct($title, $price, $numberProduct = 1){
		$this->title = $title;
		$this->price = $price;
		$this->numberProduct = $numberProduct;
	}
}

class Cart{
	public $countProduct = [];
	
	public function addProduct($product){
		
		if(array_key_exists($product->title, $this->countProduct)){
			$res =  $product->numberProduct = $product->numberProduct+ 1;
			echo 'Товар добавлен в корзину<br>';
			return $res;
		}
		else{
			$this->countProduct[$product->title] = $product;
			echo 'Товар добавлен в корзину<br>';
		}
		
	}
	
	public function deleteProduct($product){
		echo $product->title . ' удалён';
		unset($this->countProduct[$product->title]);
	}
}

class Planshet extends Product{}

$planshet = new Planshet('Asus', 2000);
$planshet2 = new Planshet('Lenovo', 3000);
$planshet3 = new Planshet('Lenovo', 3000);
$planshet4 = new Planshet('Lenovo', 3000);
$planshet5 = new Planshet('Lenovo', 3000);


$korzina = new Cart();

$korzina->addProduct($planshet); //добавляю товар в корзину
$korzina->addProduct($planshet2); //добавляю товар в корзину
$korzina->addProduct($planshet3); //добавляю товар в корзину
$korzina->addProduct($planshet4); //добавляю товар в корзину
$korzina->addProduct($planshet5); //добавляю товар в корзину


echo '<pre>';
var_dump($korzina->countProduct);
echo '</pre>';

$korzina->deleteProduct($planshet); //удаляю из корзины

echo '<pre>';
var_dump($korzina->countProduct);
Ответить с цитированием
  #2 (permalink)  
Старый 22.04.2017, 14:48
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,723

Зачем класс Product объявлен абстрактным?

<?
class Cart{
	/*
	 *	Ассоциативный массив. 
	 *	Ключ - название продукта, значение - экземпляр класса Product
	 */
    public $countProduct = [];
     
    public function addProduct($product){
		//Почему бы не isset?
        if(array_key_exists($product->title, $this->countProduct)){
			/*
			 *	Тут происходит увеличение кол-во продукта не в countProduct, 
			 *	а в переданном методу экземпляре класса
			 */
            $res =  $product->numberProduct = $product->numberProduct+ 1;
			/*
			 *	Чтобы происходило "запоминание" кол-во товара в корзине следует сделать так
			 *	$count=&$this->countProduct[$product->title]->numberProduct;//Получаю кол-во продукта
			 *	//Увеличиваю кол-во сохраненного продукта на 1 
			 *	и зачем-то присваиваю это значение свойству numberProduct переданного экземпляра
			 *	$product->numberProduct=++$count;
			 */
            echo 'Товар добавлен в корзину<br>';
            return $res;
        }
        else{
            $this->countProduct[$product->title] = $product;
            echo 'Товар добавлен в корзину<br>';
        }
         
    }
}

//Если бы мне нужно было сохранить этот принцип работы класса, то я бы его написал так
class Cart{
	static $products=array();
	
	public function addProduct(Product $product){
		$key=$product->title.' ~ '.$product->price;
		self::$products[$key]=isset(self::$products[$key])?
			(self::$products[$key]+$product->numberProduct):
			$product->numberProduct;
		
		return $this;
	}
}

Последний раз редактировалось Nexus, 22.04.2017 в 14:53.
Ответить с цитированием
  #3 (permalink)  
Старый 22.04.2017, 14:56
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от Nexus
$product->numberProduct = $product->numberProduct+ 1;
А это вообще нужно, если количество товаров в корзине это count($products)?
Ответить с цитированием
  #4 (permalink)  
Старый 22.04.2017, 15:36
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,723

Сообщение от laimas Посмотреть сообщение
А это вообще нужно, если количество товаров в корзине это count($products)?
Не понял вопроса, если честно.
В цитате Вы привели код из реализации ТС, а в самом вопросе код из реализации предложенной мною...
Ответить с цитированием
  #5 (permalink)  
Старый 22.04.2017, 15:39
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Автор сия и вы также подсчитываете количество товаров $product->numberProduct+ 1; А зачем, если это просто длина массива?

Да и вообще, корзина в первую очередь, это хранение, а уж затем способ. Автору сначала бы не мешало нечто проще написать, но именно хранение, а уж затем ООП.
Ответить с цитированием
  #6 (permalink)  
Старый 22.04.2017, 15:56
Профессор
Отправить личное сообщение для DivMan Посмотреть профиль Найти все сообщения от DivMan
 
Регистрация: 08.03.2016
Сообщений: 429

Сообщение от Nexus Посмотреть сообщение
Зачем класс Product объявлен абстрактным?
Неизвестно же, какой продукт это будет, новый или б/у.
Ответить с цитированием
  #7 (permalink)  
Старый 22.04.2017, 16:02
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

DivMan,
у вас нет корзины как таковой, есть некая обертка не понятно чего. Обратите внимание на то, что у вас проверка наличия товара производится не по уникальному идентификатору, и даже не по наименованию товара, что тоже плохо, а вообще по бренду.

Кроме того - есть массив А. В него надо поместить ключ C. Вопрос - надо ли при этом проверять наличие его в массиве (речь не о поиске, а именно о добавлении)?
Ответить с цитированием
  #8 (permalink)  
Старый 22.04.2017, 16:28
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,723

Сообщение от laimas Посмотреть сообщение
Автор сия и вы также подсчитываете количество товаров $product->numberProduct+ 1; А зачем, если это просто длина массива?
До 34-й строки второго комментария я разбираю и комментирую код ТС.
С 36-й строки того же комментария начинается класс, реализацию которого предложил я и в нем нет указанного вами кода)
Ответить с цитированием
  #9 (permalink)  
Старый 22.04.2017, 16:30
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,723

Сообщение от DivMan Посмотреть сообщение
Неизвестно же, какой продукт это будет, новый или б/у.
Как это связанно с абстракцией класса?))
Ответить с цитированием
  #10 (permalink)  
Старый 22.04.2017, 17:07
Профессор
Отправить личное сообщение для DivMan Посмотреть профиль Найти все сообщения от DivMan
 
Регистрация: 08.03.2016
Сообщений: 429

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

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

<?php
abstract class Product{
    public $title;
    public $price;
 
 
    public function __construct($title, $price){
        $this->title = $title;
        $this->price = $price;
    }
}
class Cart{
    public $countProduct = [];
 
    public function addProduct($product){                                    
       $product->numberProduct = 1; //если это убрать то тоже буде работать, только не будет учитывать первый
     
        if(array_key_exists($product->title, $this->countProduct)){
            $this->countProduct[$product->title]->numberProduct++;
       
            echo 'Товар добавлен в корзину<br>';
        }
        else{
            $this->countProduct[$product->title] = $product;
        }
    }
   
    public function deleteAllProduct($product){ //убрать все одинаковые продукты из корщины
        echo $product->title . ' удалён';
        unset($this->countProduct[$product->title]);
    }
   
    public function deleteOneProduct($product){ //убрать 1 одинаковый продукт
        if(array_key_exists($product->title, $this->countProduct)){
       
            if($this->countProduct[$product->title]->numberProduct > 0){
           
                 $this->countProduct[$product->title]->numberProduct--;
                 echo 'Товар ' . $this->countProduct[$product->title]->title. ' удалён из корзины<br>';
            }
        }
    }
 
    public function showAllProduct(){ //показать список продуктов и количество
        $resCountProduct = 0;
       
        foreach($this->countProduct as $key => $value){
            echo 'Товар ' . $key . ', количество: ' . $value->numberProduct . '<br>';
           
            $resCountProduct = $resCountProduct + $value->numberProduct;
           
           
        }
       
        echo 'Общее количество товаров: ' . $resCountProduct;
       
       
        /*
        echo '<pre>';
        var_dump($this->countProduct);
        */
    }
   
    public function sum(){ //подсчитать общую сумму продукта
       
        $res = 0;
        //var_dump($this->countProduct);
       
        foreach($this->countProduct as $key => $value){
            $res = $res + ($value->price * $value->numberProduct);
        }
       
        return $res;
       
    }
}
class Planshet extends Product{}
$asus = new Planshet('Asus', 2000);
$asus2 = new Planshet('Asus', 2000);
$asus3 = new Planshet('Asus', 2000);
$asus4 = new Planshet('Asus', 2000);
 
$lenovo = new Planshet('Lenovo', 3000);
$lenovo3 = new Planshet('Lenovo', 3000);
$korzina = new Cart();
$korzina->addProduct($asus); //добавляю товар в корзину
$korzina->addProduct($asus2); //добавляю товар в корзину
$korzina->addProduct($asus3); //добавляю товар в корзину
$korzina->addProduct($asus4); //добавляю товар в корзину
 
$korzina->addProduct($lenovo); //добавляю товар в корзину
$korzina->addProduct($lenovo3); //добавляю товар в корзину
 
 
//$korzina->deleteOneProduct($asus);
echo '<br>';
 
$korzina->showAllProduct();
 
echo '<br>';
echo '<br>';
echo 'На сумму: ' . $korzina->sum();
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не обновляется анимация при добавлении товара в корзину tetra1282 Элементы интерфейса 6 05.04.2016 17:08
Удаление товара из корзины Beginner_2016 Общие вопросы Javascript 2 12.02.2016 17:29
Ext.ux.ajax.SimManager - добавление и удаление записей khusamov ExtJS 6 09.06.2015 13:15
быстрое добавление товара в корзину ajax doz AJAX и COMET 6 24.04.2013 12:35
Добавление и удаление полей в форму anoth3r Events/DOM/Window 1 11.09.2009 15:10