遞迴調用 - PHP遞迴擷取資料

來源:互聯網
上載者:User
需求情境:通過公司某個部門的總監名稱擷取所有該部門的員工。
比如,通過總監擷取所有副總監,再通過各個副總監擷取所有各個副總監對應的經理,再通過經理擷取對應經理的員工。
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);         }                }
  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.