【php】统计goods_category表中各分类下商品的总数量

<?php

class sitemap_model extends Abstract_Model {

		/**
		 * 获得指定分类同级的所有分类以及该分类下的子分类
		 *
		 * @access  public
		 * @param   integer     $cat_id     分类编号
		 * @return  array
		 */
		function get_cat_tree($cat_id = 0){
			$tbl_category = TBL_PRE . "goods_category";//商品分类表
			$parent_id = 0;//默认情况下 父级分类id为0
			/*
			 判断当前分类中是否是底级分类,
			 如果是,则取出底级分类上级分类,
			 如果不是,则取当前分类及其下的子分类
			*/
			$sql = "SELECT count(*) FROM $tbl_category WHERE category_pid = $parent_id and is_nav = 1";//统计商品分类表中在导航栏显示的顶级分类的数量
			if ($this->db->get_one($sql) || $parent_id == 0){//数量大于0的情况
				/* 获取当前分类及其子分类 */
				$sql = "SELECT category_id,category_name ,category_pid FROM $tbl_category WHERE category_pid = '$parent_id' and is_nav = 1";//统计商品分类表中在导航栏显示的顶级分类的信息
				$res = $this->db->get_all($sql);//获取顶级分类的信息,如:女装、男装、配饰
				foreach ($res AS $row){//循环顶级分类
						$cat_arr[$row['category_id']]['id']   = $row['category_id'];//顶级分类id
						$cat_arr[$row['category_id']]['name'] = $row['category_name'];//顶级分类名称
						$cat_arr[$row['category_id']]['pid'] = $row['category_pid'];//顶级分类父id

						if (isset($row['category_id']) != NULL){//如果当前顶级分类id存在,且不为空的话
							$tmparray  = $this->get_children($row['category_id']);//获取当前顶级分类下所有一级分类id拼接成的sql,如果含有二级子分类,则也会将二级子分类id拼接进来,如:"g.category_id in (1,2,3,4,5)',这是只是一个拼接的sql语句,真正的统计数量,则是在下面这行代码
							$cat_arr[$row['category_id']]['num'] =  $this->get_cat_num($tmparray);//获取当前顶级分类下的商品数量
							$cat_arr[$row['category_id']]['cat_id'] = $this->get_child_tree($row['category_id']);//获得一级子分类及二级子分类下的商品数量
						}
				}
			}
			if(isset($cat_arr)){
				return $cat_arr;
			}
		}
		
		//获取子分类树
		function get_child_tree($tree_id = 0){//获取顶级分类下的一级子分类
			$tbl_category = TBL_PRE . "goods_category";
			$three_arr = array();
			$sql = "SELECT count(*) FROM $tbl_category WHERE category_pid = $tree_id and is_nav = 1";//当前顶级分类下的一级子分类数量
			if ($this->db->get_one($sql) || $tree_id == 0){
				$child_sql = "SELECT category_id,category_name ,category_pid FROM $tbl_category WHERE category_pid = $tree_id and is_nav = 1";
				$res = $this->db->get_all($child_sql);
				foreach ($res AS $row){
					   $three_arr[$row['category_id']]['id']   = $row['category_id'];//一级子分类id
					   $three_arr[$row['category_id']]['name'] = $row['category_name'];//一级子分类名称
					   $three_arr[$row['category_id']]['pid'] = $row['category_pid'];//一级子分类pid
					   if (isset($row['category_id']) != NULL){
							$tmparray  = $this->get_children($row['category_id']);//获取当前一级子分类及其下所有二级子分类ids拼接成的sql
							$three_arr[$row['category_id']]['num'] =  $this->get_cat_num($tmparray);//获取当前一级子分类及其下所有二级子分类的商品总数量
							$three_arr[$row['category_id']]['cat_id'] = $this->get_child_tree($row['category_id']);//递归获取当前一级子分类下的二级子分类
						}
				}
			}
			return $three_arr;
		}

		/**
         * 获得指定分类下的所有子分类的ID
         * @access public
         * @param integer $cat 指定分类的ID
         * @return string
         */
        function get_children($cat){//pid
            $sql = "SELECT category_id FROM ".TBL_PRE."goods_category where category_pid=$cat and is_nav = 1";//顶级分类下的一级子分类ids
            $res = $this->db->get_all($sql);
            $arr = array();
            foreach($res as $val){				
				$sql = "SELECT count(*) as num FROM ".TBL_PRE."goods_category where category_pid=$val[category_id] and is_nav = 1";//顶级分类下的一级子分类ids,weiyanhui
				if($this->db->get_one($sql) > 0){//适用于含有二级子分类的情况
					$arr[]=$val['category_id'];//当前一级子分类id;因为一级分类下也可能含有商品,所以必须将此一级分类id存入数组中,如:美妆/护肤
					$sql = "SELECT category_id FROM gt_goods_category where category_pid='$val[category_id]' and  is_nav = 1";//一级子分类下的二级子分类ids
					$res = $this->db->get_all($sql);
					foreach($res as $val){
						$arr[]=$val['category_id'];//一级子分类下的所有二级子分类ids,如:美妆/护肤/化妆水
					}					 
				}else{//适用于只有一级子分类的情况
					$arr[]=$val['category_id'];//当前一级子分类ids,如:配饰/腰带
				}				
            }
            $arr[]=$cat;
			$arr = array_unique($arr);//去除重复
			$item_list_tmp = '';
			foreach ($arr AS $item){
				if ($item !== ''){
					$item_list_tmp .= $item_list_tmp ? ",'$item'" : "'$item'";//拼接sql
				}
			}
            return "g.category_id" . ' IN (' . $item_list_tmp . ') ';//如:g.category_id in (1,2,3)
        }

		/**
         * 获得对应分类下所有商品数量(包含自分类数量)
         *
         * @access public
         * @param array	$children
         * @return $total
         */
		function get_cat_num($children){//统计当前分类下的商品数量(顶级分类、一级分类、二级分类、等等)
			$tbl_product = TBL_PRE . "products";
			$tbl_goods = TBL_PRE . "goods";
			$sql ="SELECT count(g.goods_id) FROM $tbl_goods AS g, $tbl_product AS p WHERE $children AND p.goods_id = g.goods_id AND p.is_check = 1 AND p.is_stop = 0 AND p.status = 1";
			return $this->db->get_one( $sql);
		}

}
?>


二、如图所示:



三、生成xml文件:

$get_cats = $sitemap_mod->get_cat_tree(0);
//百度商品搜索分类xml,weiyanhui:2013-01-30
	$cat = '<?xml version="1.0" encoding="UTF-8"?>';
    $cat .= '<cats>';
    //百度商品搜索分类xml
	foreach($get_cats as $key => $v)
    {
    	$cat .= '<cat>';
    	$cat .= '<cid>'.$v['id'].'</cid>';
    	$cat .= '<name>'.$v['name'].'</name>' ;
    	$cat .= '<pid>'.$v['pid'].'</pid>';
    	$cat .= '<number>'.$v['num'].'</number>';
		$cat .= ' </cat>';
		if(!empty($v['cat_id'])){
			foreach($v['cat_id'] as $key=>$v){
				$cat .= '<cat>';
				$cat .= '<cid>'.$v['id'].'</cid>';
				$cat .= '<name>'.$v['name'].'</name>' ;
				$cat .= '<pid>'.$v['pid'].'</pid>';
				$cat .= '<number>'.$v['num'].'</number>';
				$cat .= ' </cat>';
				if(!empty($v['cat_id'])){
					foreach($v['cat_id'] as $key=>$v){
						$cat .= '<cat>';
						$cat .= '<cid>'.$v['id'].'</cid>';
						$cat .= '<name>'.$v['name'].'</name>' ;
						$cat .= '<pid>'.$v['pid'].'</pid>';
						$cat .= '<number>'.$v['num'].'</number>';
						$cat .= ' </cat>';
					}
				}
			}
		}
    }
    $cat .= '</cats>';
    
    file_put_contents(WWW_PATH.'/sitemap/cat.xml', $cat);
    $name['cat'] = 'sitemap/cat.xml';


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值