不递归的方式更新所有用户的下属ID集合

Posted dawuge

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了不递归的方式更新所有用户的下属ID集合相关的知识,希望对你有一定的参考价值。

/**
 * 批量更新xw_kefu的sonIds
 * @author jack
 */
function kefu_update_kefuids()
{
    set_time_limit(0);
    global $db;
    $sql = "select id,name,p_id,is_lizhi from xw_kefu where is_del=0 and is_lizhi=0 and kefu_type=‘o2o‘";
    $result = $db->query($sql);
    $arrays = $db->fetch_array_all($result);
    $tmpArr = $arrays;
    foreach( $arrays as $key=>$row ){
        $kefuid = $row[‘id‘];
        $son_ids = subtree($tmpArr, $kefuid);
        $son_ids = implode(‘,‘, $son_ids);
        $sql2 = "update xw_kefu set son_ids=‘$son_ids‘ where id=$kefuid";
        $db->query($sql2);
    }
}


/**
 * 获取下级顾问所有ID集合
 * @author jack
 */
function subtree($arr, $pId=0)
{
    //创建任务表
    $task = [$pId];
    // 保存子ids的数组
    $ids = [];
    //如果任务表不为空 就表示要做任务
    while(!empty($task))
    {
        //默认是没有子级
        $flag = false;
        foreach($arr as $k=>$v)
        {
            if ($v[‘p_id‘] == $pId) {
                $ids[] = $v[‘id‘];
                //借助栈 把新的地区的id压入栈
                $task[] = $v[‘id‘];
                $pId = $v[‘id‘];
                //把找到的单元unset掉
                unset($arr[$k]);
                $flag = true;
            }
        }
        //表示没找到子树
        if (!$flag) {
            array_pop($task);
            $pId = end($task);
        }
    }
    return $ids;
}

 

以上是关于不递归的方式更新所有用户的下属ID集合的主要内容,如果未能解决你的问题,请参考以下文章

树形结构根据某节点查询本节点及下属所有子节点的递归实现

如何创建参数化递归 CTE 以展平标量函数中的层次结构?

Java非递归的方式获取目录中所有文件(包括目录)

sql 递归查询

78. Subsets

如何更新所有片段? onProgressUpdate 不更新所有片段