今天主要介紹一下使用遞歸來按層級查找數據。
原理挺簡單的,主要是經過父級id一級一級的循環查找子級,使用PHP循環代碼也很容易實現,不過若是層級越多,PHP重複代碼也越多,這時能夠使用遞歸來實現這功能。數據庫
一、首先查出要使用的數據組成一個數組(避免遞歸裏查詢數據庫,以後根據這個數組組成本身須要的數據就能夠了)
好比獲得以下數據:數組
$data = [ ['id' => '1', 'pid' => '0', 'dsp' => '1'], ['id' => '2', 'pid' => '0', 'dsp' => '2'], ['id' => '3', 'pid' => '0', 'dsp' => '3'], ['id' => '4', 'pid' => '1', 'dsp' => '1-4'], ['id' => '5', 'pid' => '4', 'dsp' => '1-4-5'], ['id' => '6', 'pid' => '5', 'dsp' => '1-4-5-6'], ['id' => '7', 'pid' => '3', 'dsp' => '3-7'], ['id' => '8', 'pid' => '2', 'dsp' => '2-8'], ['id' => '9', 'pid' => '1', 'dsp' => '1-9'], ['id' => '10', 'pid' => '4', 'dsp' => '1-4-10'], ];
二、接下來使用遞歸重組數據,使數據按層級顯示。this
/** * 根據父級id查找子級數據 * @param $data 要查詢的數據 * @param int $pid 父級id */ public function recursion($data, $pid = 0) { static $child = []; // 定義存儲子級數據數組 foreach ($data as $key => $value) { if ($value['pid'] == $pid) { $child[] = $value; // 知足條件的數據添加進child數組 unset($data[$key]); // 使用事後能夠銷燬 $this->recursion($data, $value['id']); // 遞歸調用,查找當前數據的子級 } } return $child; }
獲得結果:spa
[ { "id": "1", "pid": "0", "dsp": "1" }, { "id": "4", "pid": "1", "dsp": "1-4" }, { "id": "5", "pid": "4", "dsp": "1-4-5" }, { "id": "6", "pid": "5", "dsp": "1-4-5-6" }, { "id": "10", "pid": "4", "dsp": "1-4-10" }, { "id": "9", "pid": "1", "dsp": "1-9" }, { "id": "2", "pid": "0", "dsp": "2" }, { "id": "8", "pid": "2", "dsp": "2-8" }, { "id": "3", "pid": "0", "dsp": "3" }, { "id": "7", "pid": "3", "dsp": "3-7" } ]