从汉诺塔上写递归

 

需求: 求出每一级的数量,但是父级+子级的所有数量。

比如 第一级本身数量为1 而子级是2 ,那么相加就是3,但是2级还有3级,就需要再加上3级。依次类推到最后一级数量之和就是这个分类的总数量。

实现的思路:

1:我们需要找到自身的数量.

2.1:我们找到自身的下一级所有数量相加 ,返回数量.

2.2:子级再去调用方法1,这样最后累加。

 

代码:

class Test
{
    public static function  getAllData()
    {
        echo '<pre>';
        $data=[];
        self::_getData($data,'1');
        var_dump($data);exit;
    }

    //获取自身+子级
    private static function _getData(&$data,$id)
    {
        $item = self::_getDataById($id);
        if ($item==null) {
           return 0;
        }
        array_push($data,$item);
        $tem_key = count($data)-1;
        $child_amount = 0;
        $child_item=  self::_getChildrenData($id);
        foreach ($child_item as $item)
        {
            $amount = self::_getData($data,$item['id']);
            $child_amount +=$amount;
        }
        $data[$tem_key]['amount']+=$child_amount;
        return  $data[$tem_key]['amount'];
    }

    //获取自身
    private static function _getDataById($id)
    {
        $sql='SELECT * FROM  category WHERE id=:id';
        $cmd = \Yii::$app->db->createCommand($sql);
        $cmd->bindValue(':id', $id);
        return $cmd->queryOne();
    }

    //获取子级
    private static function _getChildrenData($id)
    {
        $sql='SELECT * FROM  category WHERE parent_id=:id';
        $cmd = \Yii::$app->db->createCommand($sql);
        $cmd->bindValue(':id', $id);
        return  $cmd->queryAll();
    }

}

 

 部分结构:

 

posted @ 2019-01-30 17:09  鲜花满月楼  阅读(252)  评论(0编辑  收藏  举报