從漢諾塔上寫遞歸
阿新 • • 發佈:2019-01-30
from img 調用方法 ret one func create null parent
需求: 求出每一級的數量,但是父級+子級的所有數量。
比如 第一級本身數量為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(); } }
部分結構:
從漢諾塔上寫遞歸