1. PHP / Говнокод #25764

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    $products = $this->cart->getProducts();
    foreach ($products as $product) {
    	$product_total = 0;
    	foreach ($products as $product_2) {
    		if ($product_2['product_id'] == $product['product_id']) {
    			$product_total += $product_2['quantity'];
    		}
    	}
    ....
    }

    Поечему опенкарт так странно вычисляет количество товаров в корзине? неужели нет способа изящней?

    Запостил: pseudoJun, 14 Августа 2019

    Комментарии (23) RSS

    • Ничего не понял.
      Ответить
    • Опять ничего не понял.
      Ответить
    • А вот теперь я все понял. На главной нет формы.

      Именно поэтому я за "PHP"
      Ответить
    • Вы не подумайте, я не свами разговариваю, я не сумашедши.
      Именно поэтому я за "PHP"
      Ответить
    • Там очередной литак с руснёй ебнулся.
      Ответить
    • Пытаются вычислить сколько же продуктов *на самом деле* добавил пользователь в корзину. Вестимо не уникальное хранилище.
      Ответить
      • Во вложенном цикле на самом деле вычисляется Σ по всем $X от $X['quantity']*($X['product_id'] == $product['product_id']). Т. е. происходит выборка товаров, у которого поле product_id совпало с product_id текущего товара. Причём с квадратичной сложностью. Причём если таких неуникальных товаров много, мы их посчитаем несколько раз, так что где-то ниже по коду придётся удалять неуникальные позиции.

        Предполагаю, что где-то выше выборка из БД, а там можно было сделать GROUP BY, чтобы потом так не мучиться.
        Ответить

        • опять математика

          я программист, я не обязан знать математику
          Ответить
          • Именно поэтому я за «PHP». Я просто пишу такой же код, как в «Opencart», и теку.
            Ответить
            • это же и есть греческий
              public function getLengthClasses($data = array()) {
              		if ($data) {
              			$sql = "SELECT * FROM " . DB_PREFIX . "length_class lc LEFT JOIN " . DB_PREFIX . "length_class_description lcd ON (lc.length_class_id = lcd.length_class_id) WHERE lcd.language_id = '" . (int)$this->config->get('config_language_id') . "'";
              			$sort_data = array(
              				'title',
              				'unit',
              				'value'
              			);
              			if (isset($data['sort']) && in_array($data['sort'], $sort_data)) {
              				$sql .= " ORDER BY " . $data['sort'];
              			} else {
              				$sql .= " ORDER BY title";
              			}
              			if (isset($data['order']) && ($data['order'] == 'DESC')) {
              				$sql .= " DESC";
              			} else {
              				$sql .= " ASC";
              			}
              			if (isset($data['start']) || isset($data['limit'])) {
              				if ($data['start'] < 0) {
              					$data['start'] = 0;
              				}
              				if ($data['limit'] < 1) {
              					$data['limit'] = 20;
              				}
              				$sql .= " LIMIT " . (int)$data['start'] . "," . (int)$data['limit'];
              			}
              			$query = $this->db->query($sql);
              			return $query->rows;
              		} else {
              			$length_class_data = $this->cache->get('length_class.' . (int)$this->config->get('config_language_id'));
              			if (!$length_class_data) {
              				$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "length_class lc LEFT JOIN " . DB_PREFIX . "length_class_description lcd ON (lc.length_class_id = lcd.length_class_id) WHERE lcd.language_id = '" . (int)$this->config->get('config_language_id') . "'");
              				$length_class_data = $query->rows;
              				$this->cache->set('length_class.' . (int)$this->config->get('config_language_id'), $length_class_data);
              			}
              			return $length_class_data;
              		}
              	}
              Ответить
          • Ты не программист, ты обязан знать греческий.
            Ответить

    Добавить комментарий