按条件查询出用户ID上级符合条件的PID

PHP按条件循环查出第一个符合条件的ID 怎么写?

img

查询出用户ID4的上级推荐人,条件:判断管理等级是否启用,推荐人等级大于1,如果没启用继续查询上上级,直至查出符合条件的第一个ID

$parent1 = Db::name('member')->where('aid',aid)->where('id',$this->member['pid'])->find();

$agleveldata = Db::name('level')->where('aid',aid)->where('id',$this->member['levelid'])->find();

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
在PHP中,你可以使用循环来按条件查找符合条件的第一个ID。以下是一个可能的解决方案:

$userId = 4;
$levelEnabled = true;

$parentId = null;
$currentUserId = $userId;

while ($parentId === null && $currentUserId !== null) {
    $user = Db::name('member')->where('id', $currentUserId)->find();
    
    if ($user && $user['pid'] > 0) {
        $parent = Db::name('member')->where('id', $user['pid'])->find();
        
        if ($parent) {
            $agleveldata = Db::name('level')->where('id', $parent['levelid'])->find();
            
            if ($agleveldata && $agleveldata['isEnabled'] && $agleveldata['level'] > 1) {
                $parentId = $parent['id'];
            } elseif (!$levelEnabled) {
                $parentId = $parent['id'];
            } else {
                $currentUserId = $parent['id'];
            }
        } else {
            $currentUserId = null;
        }
    } else {
        $currentUserId = null;
    }
}

if ($parentId !== null) {
    echo "The first matching parent ID is: " . $parentId;
} else {
    echo "No matching parent ID found.";
}

在上面的代码中,我们使用了一个while循环来按条件逐级查找上级推荐人。循环将继续执行直到找到符合条件的第一个ID或者无法找到更多的上级推荐人。在每一次循环中,我们检查当前用户的上级推荐人,并判断其管理等级是否启用且等级大于1。如果符合条件,我们将找到的ID存储在$parentId变量中并结束循环。如果不符合条件,我们将当前用户的上级推荐人作为新的当前用户,继续下一轮循环。

请注意,上述代码仅提供了一个示例解决方案,具体实现可能需要根据你的数据库结构和业务逻辑进行适当的调整。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

$target_uid = 4;
do {
    $matcher = null; // 保存满足条件的数据
    // 查询target的上级数据
    $match_level_result = Db::name("member")->where("user_id", target_uid)
        ->where("level", "gt", 1)
        ->find();

    // 如果不存在上级数据则没有满足的数据,直接终止
    if (empty($match_level_result)) {
        break;
    }

    // 接收上级的ID,用于下次遍历
    $target_uid = $match_level_result['pid'];

    // 判断状态是否满足
    $status_result = Db::name("level")->where("id", $target_uid)
        ->where("status", 1)
        ->find();

    // 状态不满足则执行下次遍历
    if (empty($status_result)) {
        continue;
    }
    
    // 找到满足的数据了
    $matcher = $match_level_result;
} while(empty($matcher));

if (empty($matcher)) {
    echo "没有满足条件的数据", PHP_EOL;
} else {
    echo "找到满足条件的数据了", PHP_EOL;
var_dump($matcher);
}

引用 皆我百晓生 小程序回复内容作答:
以下是PHP中的代码示例,该示例按条件循环查找符合条件的第一个ID:

function getRecommendedParentId($userId) {
    $parentId = $userId;
    
    while ($parentId != 0) {
        $parent = Db::name('member')->where('aid',aid)->where('id',$parentId)->find();
        
        // 判断管理等级是否启用,推荐人等级大于1
        $agleveldata = Db::name('level')->where('aid',aid)->where('id',$parent['levelid'])->find();
        
        if ($agleveldata && $agleveldata['status'] == 1 && $agleveldata['level'] > 1) {
            return $parent['id'];
        }
        
        $parentId = $parent['pid'];
    }
    
    return null;
}

$userId = 4;
$recommendedParentId = getRecommendedParentId($userId);

以上代码中,getRecommendedParentId 函数接收一个用户ID作为参数,并按照条件循环查询符合条件的上级推荐人ID。在循环中,首先通过用户ID查询上级推荐人信息,然后根据所需的条件判断管理等级是否启用以及推荐人等级是否大于1。如果符合条件,则返回上级推荐人ID。如果不符合条件,则继续查询上上级的推荐人,直至找到符合条件的第一个ID。如果找不到符合条件的ID,则返回 null。

最后,你可以通过传入用户ID调用 getRecommendedParentId 方法来获取推荐人ID,如示例中的 $userId = 4,通过 $recommendedParentId 变量获取查询结果。

结合GPT给出回答如下请题主参考
可以使用递归函数来实现此需求,以下是示例代码:

function findFirstValidParent($userId) {
    // 查询当前用户的信息
    $userInfo = getUserInfoById($userId);
    
    // 判断当前用户是否有推荐人
    if ($userInfo['pid'] == 0) {
        return 0; // 当前用户没有推荐人,返回0表示查找失败
    }
    
    // 查询当前用户的推荐人信息
    $parentInfo = getUserInfoById($userInfo['pid']);
    
    // 判断推荐人是否符合条件
    if ($parentInfo['level'] > 1 && $parentInfo['enable'] == 1) {
        return $parentInfo['id']; // 推荐人符合条件,直接返回其ID
    }
    
    // 推荐人不符合条件,递归查找其上级推荐人
    return findFirstValidParent($parentInfo['id']);
}

// 调用函数查找用户ID为4的上级推荐人
$parentId = findFirstValidParent(4);
if ($parentId == 0) {
    echo "未找到符合条件的推荐人";
} else {
    echo "符合条件的推荐人ID为:" . $parentId;
}

需要注意的是,在递归函数中需要保证可以跳出递归循环,因此需要判断当前用户是否有推荐人,如果没有则直接返回0表示查找失败。同时也需要注意函数调用的性能问题,因为递归调用可能会带来较大的性能开销。

参考gpt:
结合自己分析给你如下建议:
条件查询出用户ID上级符合条件的PID-编程语言-CSDN问答:这个网页提供了一个类似的问题,以及一个可能的解决方案。该解决方案使用了一个while循环来按条件逐级查找上级推荐人,并判断其管理等级是否启用且等级大于1。如果符合条件,就返回找到的ID,否则就继续查找上上级,直到找到符合条件的第一个ID或者无法找到更多的上级推荐人。
PHP: uniqid - Manual:这个网页介绍了PHP中的uniqid函数,它可以根据当前时间生成一个唯一的标识符。这个函数可以用来生成ID,但是它不保证返回值的安全性和唯一性。如果需要安全和随机的ID,可以使用random_bytes或random_int函数。
PHP If…Else 语句 | 菜鸟教程:这个网页教你如何在PHP中使用条件语句来执行不同的动作。你可以使用if、else if和else关键字来根据不同的条件执行不同的代码块。

试试

function find_parent($user_id) {
  
  $user = Db::name('member')->where('aid', aid)->where('id', $user_id)->find();
  
  if (!$user) {
    return null;
  }
  
  $parent = Db::name('member')->where('aid', aid)->where('id', $user['pid'])->find();
  
  if (!$parent) {
    return null;
  }
  
  $parent_level = Db::name('level')->where('aid', aid)->where('id', $parent['levelid'])->find();
  
  if ($parent_level['status'] == 1 && $parent_level['id'] > 1) {
    return $parent['id'];
  }
  
  else {
    return find_parent($parent['id']);
  }
}


$result = find_parent(4);

if ($result) {
  echo "找到符合条件的推荐人ID:".$result;
}

else {
  echo "没有找到符合条件的推荐人";
}


参考

$aid = 4; // 假设要查询用户ID为4的上级推荐人

// 检查管理等级是否启用
$agleveldata = Db::name('level')->where('aid', $aid)->where('id', $this->member['levelid'])->find();

if ($agleveldata && $agleveldata['status'] == 1) {
    // 如果管理等级启用并且推荐人等级大于1,则查询上级推荐人
    if ($this->member['pid'] > 0) {
        $parent1 = Db::name('member')->where('aid', $aid)->where('id', $this->member['pid'])->find();
        if ($parent1 && $parent1['level'] > 1) {
            // 符合条件的上级推荐人已找到
            $recommendedUserId = $parent1['id'];
        } else {
            // 上级推荐人等级不符合条件,继续查询上上级
            $grandparent1 = Db::name('member')->where('aid', $aid)->where('id', $parent1['pid'])->find();
            // 继续循环查询上级,直到找到符合条件的上级或达到顶级
            while ($grandparent1 && $grandparent1['level'] <= 1) {
                $grandparent1 = Db::name('member')->where('aid', $aid)->where('id', $grandparent1['pid'])->find();
            }
            if ($grandparent1 && $grandparent1['level'] > 1) {
                // 符合条件的上级推荐人已找到
                $recommendedUserId = $grandparent1['id'];
            } else {
                // 没有符合条件的上级推荐人
                $recommendedUserId = null;
            }
        }
    } else {
        // 没有上级推荐人
        $recommendedUserId = null;
    }
} else {
    // 管理等级未启用
    $recommendedUserId = null;
}

if ($recommendedUserId) {
    // 找到了符合条件的推荐人,$recommendedUserId 包含了用户ID
    echo "符合条件的推荐人ID为: " . $recommendedUserId;
} else {
    // 没有符合条件的推荐人
    echo "没有符合条件的推荐人";
}



 $this->get_array($user['uid'],1);

    function get_array($user_id,$top=0){
        $sql = 'SELECT * FROM  ' . tablename('user').'where pid=:pid';
        $params = array(':pid' => $user_id);
        $rows = pdo_fetchall($sql, $params);
        foreach ($rows as $key=>$value)
        {
            $r = $this->get_array($value['uid']); //调用函数,传入参数,继续查询下级
            $arr[0]['children'][$key]['uid']= $value['uid']; //组合数组
            $arr[0]['children'][$key]['wechaname']= $value['wechaname']; //组合数组
            if(is_array($r)){
                $arr[0]['children'][$key]['children']= $r[0]['children'];
            }

        }
        return $arr;
    }

用循环来查询符合条件的第一个推荐人ID。使用了一个while循环,每次循环中查询当前用户的上级推荐人并判断是否符合条件。如果符合条件,则将该推荐人的ID赋值,并跳出循环。如果不符合条件,则将当前用户的上级赋值给pid并跳出循环。如果不符合条件,则将当前用户的上级ID赋值给userId,继续下一次循环,直至找到符合条件的第一个上级推荐人或者没有上级推荐人为止。最后,$pid即为符合条件的第一个上级推荐人ID。,以下是一个PHP示例代码:


$pid = 0; // 初始化pid为0
$userId = 4; // 用户ID

while ($userId > 0) {
    $userData = Db::name('member')->where('aid', $aid)->where('id', $userId)->find();
    
    if ($userData['pid'] == 0) {
        break; // 如果已经没有上级推荐人,则跳出循环
    }
    
    $agleveldata = Db::name('level')->where('aid', $aid)->where('id', $userData['levelid'])->find();
    
    if ($agleveldata['启用管理等级'] && $agleveldata['等级'] > 1) {
        $pid = $userData['pid'];
        break; // 找到符合条件的第一个上级推荐人,跳出循环
    }
    
    $userId = $userData['pid']; // 继续查询上级
}

// $pid为符合条件的第一个上级推荐人ID



public function get上级推荐人($uid, $aid) {
    // 查询用户基本信息
    $user = Db::name('member')->where('aid', $aid)->where('id', $uid)->find();

    if ($user['status'] == '启用') { // 判断管理等级是否启用
        // 如果启用了,判断推荐人等级是否大于1
        if ($user['level'] > 1) {
            return $uid; // 如果推荐人等级大于1,返回当前用户ID
        } else {
            // 如果推荐人等级不大于1,查询上级推荐人
            return $this->get上级推荐人($user['pid'], $aid);
        }
    } else {
        // 如果未启用,继续查询上上级推荐人
        return $this->get上级推荐人($user['pid'], $aid);
    }
}

参考gpt
在PHP中,您可以使用循环来查询符合条件的第一个ID。以下是一个示例代码:

function findParentID($userID) {
    $parentID = null;
    $levelEnabled = true;
    $currentUserID = $userID;

    while ($parentID === null && $levelEnabled) {
        $parent = Db::name('member')->where('id', $currentUserID)->find();
        $level = Db::name('level')->where('id', $parent['levelid'])->find();

        if ($level['is_enabled'] && $level['level'] > 1) {
            $parentID = $parent['id'];
        } else {
            $currentUserID = $parent['pid'];
            if ($currentUserID === null) {
                break;
            }
        }
    }

    return $parentID;
}

$parentID = findParentID(4);

在上述代码中,findParentID函数接受一个用户ID作为参数,并使用while循环来查询符合条件的第一个ID。循环中,首先查询当前用户的上级信息和级别信息,然后根据条件判断是否符合要求。如果符合要求,则将上级ID赋值给$parentID,循环结束。如果不符合要求,则将上级ID作为下一次循环的用户ID,继续查询上级。如果没有上级或者级别未启用,则循环结束。

最后,您可以调用findParentID函数并传入用户ID来获取符合条件的第一个上级ID。在示例代码中,$parentID变量将包含用户ID为4的上级ID。

通过 If…Else 语句来判断执行

通过条件语句来判断呀

我帮你写了个实例代码,你可以先测试再确认,

$pid = 0; // 初始化pid为0
$userId = 4; // 用户ID
while ($userId > 0) {
    $userData = Db::name('member')->where('aid', $aid)->where('id', $userId)->find();
    if ($userData['pid'] == 0) {
        break; // 如果已经没有上级推荐人,则跳出循环
    }
   
    if ($agleveldata['启用管理等级'] && $agleveldata['等级'] > 1) {
        $pid = $userData['pid'];
        break; // 找到符合条件的第一个上级推荐人,跳出循环
    }
    $userId = $userData['pid']; // 继续查询上级
}
// $pid为符合条件的第一个上级推荐人ID