無限分類遞迴的實現
阿新 • • 發佈:2019-01-08
無限分類、找所有上級、所有子類…..這些都是無限分類。小編恰好,這兩年都跟相關內容打交道,故總結了一點方法。
- 有如下結構的資料:
// id 為主鍵
// pid 為父級的id
$a = [
['id'=>1, 'pid'=>0, 'name'=>'a1'],
['id'=>2, 'pid'=>1, 'name'=>'a2'],
['id'=>3, 'pid'=>2, 'name'=>'a3'],
['id'=>4, 'pid'=>3, 'name'=>'a4'],
['id' =>5, 'pid'=>4, 'name'=>'a5'],
['id'=>6, 'pid'=>5, 'name'=>'a6'],
];
如何查詢’a3’所有的下級
// 函式定義(在類中自己修改)
/**
* 遞迴的實線
* @author Tom
*
* @param array $array 需要遞迴的陣列
* @param int $topId 頂級的id
* @param int $lev 定義層級
*/
function getLower($array, $topId, $lev = 0) {
$result = [];
foreach ($array as $key => $value) {
if ($value['pid'] == $topId) {
$value['lev'] = $lev; // 定義層級
$result[] = $value;
$result = array_merge($result, getLower($array, $value['id'], $lev + 1));
}
}
return $result;
}
$result = getLower($a , 3, 0);
// 結果如下
/**
array(
array('id'=>4, ....,'lev'=>0)
array('id'=>5, ....,'lev'=>1)
array('id'=>6, ....,'lev'=>2)
);
*/
變種方法
// 查詢下級的所有主鍵
function getLowerId($array, $topId)
{
$result = [];
foreach ($array as $key => $value) {
if ($value['h'] == $topId) {
$result[] = $value['id'];
$result = array_merge($result, getLower($array, $value['id']));
}
}
return $result;
}
資料庫的設計
有上下級關係時,建議使用者表分兩張,其中一張為主使用者表(如users,含id,name,age等多個欄位),包含的是所有的詳細資訊;另一張是附表(users_layer),只存上下級(三個欄位足矣,主鍵id,userid,pid)
使用:
- 查詢出users_layer中所有的資訊;
- 根據指定的id,查詢所有下級的id;
- 根據id使用in方法查詢資料庫指定的使用者資訊。
這樣不僅能遞迴,也能減少資料庫的查詢。