1. 程式人生 > >無限分類遞迴的實現

無限分類遞迴的實現

無限分類、找所有上級、所有子類…..這些都是無限分類。小編恰好,這兩年都跟相關內容打交道,故總結了一點方法。

  • 有如下結構的資料:
// 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)
使用:


  1. 查詢出users_layer中所有的資訊;
  2. 根據指定的id,查詢所有下級的id;
  3. 根據id使用in方法查詢資料庫指定的使用者資訊。

這樣不僅能遞迴,也能減少資料庫的查詢。