数据库提取的无限级数据排序

来源:互联网 发布:linux面试题及答案100 编辑:程序博客网 时间:2024/05/22 16:43

/**
 * 判断节点是否有子节点
 *
 * @param array $arr 要序列化的数组
 * @param 父结点名称
 * @param int $pid 节点ID
 * @return boolean
 */
function existsChild($arr, $pname, $pid)
{
    foreach ($arr as $val)
    {
        if($val[$pname] == $pid)
        {
            return true;           
        }
    }
    return false;
}

/**
 * 序列化树
 *
 * @param array $arr 要序列化的数组
 * @param 子结点的名称
 * @param 父结点的名称
 * @param int $pid 第一层父类ID
 * @param int $repeat 分级间隔
 * @return array
 */
function listClass($arr, $cname, $pname, $pid = 0, $repeat = 0)
{
    if(!is_array($arr)) {
        echo '传入的不是数组';
        exit;
    }
    if(empty($cname) || empty($pname)) {
        echo '子类和父类字段名不能为空';
        exit;
    }
    foreach ($arr as $key => $val)
    {
        if($val[$pname] == $pid)
        {
            $arrChild = array();
            if($pid != 0)
            {
                $repeat++;
            }
            $str = str_repeat('  ', $repeat);
            $arr[$key]['space'] = $str;
            if(existsChild($arr, $pname, $val[$cname]))
            {
                $arr[$key]['undel'] = 1;
                $arrChild = listClass($arr, $cname, $pname, $val[$cname], $repeat);
            }
            $array[] = $arr[$key];
            $array   = array_merge($array, $arrChild);
            if($pid != 0)
            {
                $repeat--;
            }
        }
    }
    if(!is_array($array))
    {
        return array();
    }
    return $array;
}

/**
 * 找出一个结点的所有子节点ID
 *
 * @param 序列化后的数组 $arr
 * @param 子节点名 $cname
 * @param 父结点名 $pname
 * @param 要查找的子节点ID $cid
 * @param 第一层父结点 $ppid
 */
function listChildId($arr, $cname, $pname, $cid, $ppid=0)
{
    if(!is_array($arr)) {
        echo '传入的不是数组';
        exit;
    }
    if(empty($cname) || empty($pname)) {
        echo '子类和父类字段名不能为空';
        exit;
    }
    $rt = 0;
    $st = 0;
    foreach ($arr as $key => $val)
    {
        if($val[$cname] == $cid) {
            $rt  = 1;
            $pid = $val[$pname];
        }
        if($val[$cname] != $cid && $rt && ($val[$pname] == $pid || $val[$pname] == $ppid)) $st = 1;
       
        if($st) {
            return $cids;
        }
       
        if($rt == 1) {
            $cids[] = $val[$cname];
        }
    }
   
    return $cids;
}

原创粉丝点击