"PHP" / Говнокод #25764 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 pseudoJun, (Updated )

Комментарии (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;
            		}
            	}
            Ответить

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

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8