需求情境:通過公司某個部門的總監名稱擷取所有該部門的員工。
比如,通過總監擷取所有副總監,再通過各個副總監擷取所有各個副總監對應的經理,再通過經理擷取對應經理的員工。
mysql的表結構這麼設計的,總監的id是1,那麼副總監的parent_id就是1,如果副總監的id分別是2、3、4、5等等,那麼各個經理的parent_id就是2、3、4、5,依次類推形成一個遞迴的資料。
問1:PHP如何通過遞迴一次性把所有總監以下的資料儲存到一個變數呢?
問2:取出資料後如何區分哪些是副總監哪些是經理哪些是一線員工呢?
問3:如何分頁?(按照我的理解,即使是分頁也需要把全部資料遞迴完畢之後再進行計算,而不是limit 1,10等形式分頁)
問題有點多,還請各位大拿請教,多謝。
如下是My Code。貌似死迴圈了。。。
public function recuresion($res) { foreach ($res as $k => $v) { $tmpRes[] = $this->obj->getResult($v['id']); //假設通過該方法擷取副總監、經理、員工 if (!empty($tmpRes)) { return $this->recuresion($tmpRes); } else { return $tmpRes; } } }$a = recuresion($res); //這裡假設$res是擷取的總監的資料print_r($a);
回複內容:
需求情境:通過公司某個部門的總監名稱擷取所有該部門的員工。
比如,通過總監擷取所有副總監,再通過各個副總監擷取所有各個副總監對應的經理,再通過經理擷取對應經理的員工。
mysql的表結構這麼設計的,總監的id是1,那麼副總監的parent_id就是1,如果副總監的id分別是2、3、4、5等等,那麼各個經理的parent_id就是2、3、4、5,依次類推形成一個遞迴的資料。
問1:PHP如何通過遞迴一次性把所有總監以下的資料儲存到一個變數呢?
問2:取出資料後如何區分哪些是副總監哪些是經理哪些是一線員工呢?
問3:如何分頁?(按照我的理解,即使是分頁也需要把全部資料遞迴完畢之後再進行計算,而不是limit 1,10等形式分頁)
問題有點多,還請各位大拿請教,多謝。
如下是My Code。貌似死迴圈了。。。
public function recuresion($res) { foreach ($res as $k => $v) { $tmpRes[] = $this->obj->getResult($v['id']); //假設通過該方法擷取副總監、經理、員工 if (!empty($tmpRes)) { return $this->recuresion($tmpRes); } else { return $tmpRes; } } }$a = recuresion($res); //這裡假設$res是擷取的總監的資料print_r($a);
貌似純 SQL 就能搞定,不需要 PHP 摻和……
問 1:
select id, name, parent_id from (select * from employee order by parent_id, id) sorted, (select @pv := '1') initialisationwhere find_in_set(parent_id, @pv) > 0and @pv := concat(@pv, ',', id)
問 2:
外面再套一層就好了:select * from (
問 1 的 SQL) e1 where not exists (select * from employee e2 where e2.parent_id = e1.id)
問 3:
既然是純 SQL 的話,直接 limit
分頁就好了。
非要 PHP 的話:
public function recursion($res){ $output = array(); foreach ($res as $k => $v) { $tmpRes = $this->obj->getResult($v['id']); $output []= $v; if (!empty($tmpRes)) { $output = array_merge($output, $this->recursion($tmpRes)); } } return $output;}$a = recursion($res);
呵呵,既然你有如此個人化的需求,就應該有一個人化的專用表, 在你的表裡面再加一個欄位,int level ,level這個欄位意義就是相對於頂級分類,自己這條記錄是屬於第幾級分類,
如:
總監 的level 是 0
副總監 的level 是 1
經理 的level是 2
.....
插入記錄的時候,應該能夠知道。父記錄的level是多少,然後+1以後存進資料庫。
這樣子就樓主的問題就簡單了,
1,所有總監以下的員工就是level非0的記錄。
2,通過level可以分清楚員工的類型,
3,分頁,還是通過limit 0,10 這種方法分。
手機碼字,排版不方便,請自己慢慢看
$tmpRes[]?不清空的話這數組越來越大
$result=array();public function recuresion($res) { $tmpRes=array(); foreach ($res as $k => $v) { $result[k]=$v; $tmpRes[] = $this->obj->getResult($v['id']); //假設通過該方法擷取副總監、經理、員工 } if (!empty($tmpRes)) { return $this->recuresion($tmpRes); } }