Главная > Заметки, Сделай сам, Статьи > Подсчет количества товаров в каждой ветке дерева каталога

Подсчет количества товаров в каждой ветке дерева каталога

Допустим у Вас имеется каталог на сайте. Коталог состоит из дерева разделов, в каждой ветке которого может быть N-ое кол-во товаров.

Например имеется дерево:

--Телевизоры
---- Sony
-------Trinitron
-------Megatron
-------Valtron
---- Toshiba
---- Rolsen

Нужно показывать кол-во товаров суммарно от текущей ветки до последней включительно. Допустим что модель SONY делится еще на три под рубрики, а вот Тошиба и Ролсен — нет, а нам надо знать сколько в каждой рубрике товаров, причем если это самая верхняя ветка — то показывать суммарно кол-во товаров от вех дочерних разделов:

function getAllCountItems_inTree($pid, $sum)
{
    global $DB;
    if ($sum==0)
        $sum = $DB->getOne('SELECT count(*) FROM mp_table_items WHERE art_id = "'.$DB->pre((int)$pid).'"');
    $all = $DB->getAll('SELECT id FROM mp_table_articles WHERE parent="'.$DB->pre((int)$pid).'" AND active=1');
    if (sizeof($all))
    {
        foreach ($all as $num => $item)
        {
            $cnt = $DB->getOne('SELECT count(*) FROM mp_table_items WHERE art_id = "'.$DB->pre((int)$item['id']).'"');
            $sum = $sum + $cnt;
            $sum = getAllCountItems_inTree((int)$item['id'], $sum);
        }
    }
    return $sum;
}
// NODE_ID - ID ветки в дереве, по которой будет спуск вниз по ее детям

echo getAllCountItems_inTree(NODE_ID, 0); 

Передавая NODE_ID при построении дерева, мы получим кол-во товаров на всю ветку и ниже для «детей» «родителя»
Возможно это не самый лучший способ подсчета, но это вариант для размышления над более новыми методами подсчета.
можно использовать всякие способы кеширования вывода например Memcache, о котором будет рассказано чуть позже.

и в результате получится:

--Телевизоры (26)
---- Sony (13)
-------Trinitron (3)
-------Megatron (4)
-------Valtron (6)
---- Toshiba (5)
---- Rolsen (8)

Заметки, Сделай сам, Статьи , ,

  1. Комментариев пока нет.
  1. Трекбеков пока нет.