PHP如何以查询的结果为条件一直循环查询下去,直到没有新的结果为止

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP如何以查询的结果为条件一直循环查询下去,直到没有新的结果为止相关的知识,希望对你有一定的参考价值。

如题,比如说有个用户A,他推荐了用户B和用户C到平台,用户B又推荐了D,E,F。C推荐了G,H。D又推荐了I,J,K。如此无限循环。用户自己有uid,用户之间通过aid相互关联上下级,请问如何利用php将用户A的所有下级都循环查找出来?

你的指的是无限级吧,A是B和C的父级,B是D,E,F的父级,C是G和H的父级,D又是I,J,K的父级。一般都是采用递归算法。

        /**  
     * 无限级的遍历  
     * @param  [array]  $data      所有数据  
     * @param  integer $parent parent为0时,是最祖先级  
     * @param  integer $level     记录几级 
     * @return [array]            已经遍历好的数组  
     */  
    public function category($data,$parent=0,$level=0)  
        $array = [];  
        foreach ($data as $key => $value)   
            if($value['parent'] == $parent)  
                $value['level'] = $level;  
                $array[] = $value;  
                $this->category($data,$value['id'],$level+1);  
              
          
        return $array;  
    

追问

能否写个完整的php代码,这么写只需要传递最顶级也就是A的uid就可以了吗

追答

假定你的用户表:user表

select uid,name from use where 你要的条件;

下面是个无线级的类:

class Tree

    static public $treeList = [];   //存放无限极结果
    static public $treeArray =[];   //嵌套无限极结果
    
    public function __construct()
    
        self::$treeList = [];
        self::$treeArray = [];
    
    
    public function create($data, $pid=0, $h_layer=0, $parent_id = 'pid')
    
        if(!empty($data))
            foreach($data as $key => $value)
                $h_layer++;
                if($value[$parent_id] == $pid)
                    $value['h_layer'] = $h_layer;
                    self::$treeList[]=$value;
                    unset($data[$key]);
                    self::create($data,$value['uid'],$h_layer);
                
                $h_layer--;
            
        
        return self::$treeList;
    
    

$tree = new Tree();
// $data 是你从数据库中拿到的数据,不知道你是写原生取的,还是利用什么框架取的
$tree->create($data);

追问

你好,请问代码中的pid和parent_id分别对应我这里什么属性?我这里每个用户都有自己的id,然后上下级关联用的aid。比如A是B的上级,A的id是1,B的id是2,那么B在表中存储的字段就是id为2,aid为1.并且提示 if($value[$parent_id] == $pid)这一句Undefined index: pid

参考技术A 很简单,只要你把这些查询出来的数据写到一个函数里,然后到时候直接调用就行了,这样就满足了你的要求了 参考技术B 就是无限极,一般用递归,这个要去学下怎么写

php中的多条件查询

首先是查询所有,步骤不详述,连接数据库,查询表中的所有信息,foreach循环以表格的形式打印出来

 

然后就是form表单中提交查询的数据,这里以post方式提交到本页面,所以要判断post中是否有值,在判断post中的值是否为空字符串(这两种情况都默认用户没有输入,查询所有)默认规则:一般来说做查询的时候:用户不输入任何内容就是查询所有的

 

然后最重要的是拼接查询条件

关键代码:

$tj1 = " 1=1";
$tj2 = " 1=1";
$name = "";
 
if(!empty($_POST)){
    if($_POST["name"] != ""){
        $name = $_POST["name"];
        $tj1 = " name like ‘%{$name}%‘";
    }
    if($_POST["brand"] != ""){
        $tj2 = " brand = ‘{$_POST[‘brand‘]}‘";
    }
}
$tj = " where ".$tj1." and ".$tj2;
$sql = "select * from car ".$tj;
 
 
 
 
 
 
完整实例:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head>
 
<body>
<h1>查询系统</h1>
<Form action="danchaxun.php" method="post">
请输入汽车名称:
<input type="text" name = "name" />
请输入汽车系列:
<input type="text" name = "brand" />
<input type="submit" value="查询" />
</Form>
 
<table width="100%" border="1" cellpadding="0" cellspacing="0">
<tr>
    <td>代号</td>
    <td>名字</td>
    <td>系列</td>
    <td>出厂时间</td>
    <td>油耗</td>
    <td>功率</td>
</tr>
 
<?php
include ("DBDA.class.php");
 
$db = new DBDA();
 
$tj1 = " 1=1";
$tj2 = " 1=1";
$name = "";
 
if(!empty($_POST)){
    if($_POST["name"] != ""){
        $name = $_POST["name"];
        $tj1 = " name like ‘%{$name}%‘";
    }
    if($_POST["brand"] != ""){
 
        $tj2 = " brand = ‘{$_POST[‘brand‘]}‘";
    }
}
$tj = " where ".$tj1." and ".$tj2;
 
$sql = "select * from car ".$tj;
 
$attr = $db->Query($sql);
 
foreach($attr as $v){
    echo "
        <tr>
    <td>{$v[0]}</td>
    <td>{$v[1]}</td>
    <td>{$v[2]}</td>
    <td>{$v[3]}</td>
    <td>{$v[4]}</td>
    <td>{$v[5]}</td>
</tr>
    ";
}
?>
</table>
</body>
</html>

以上是关于PHP如何以查询的结果为条件一直循环查询下去,直到没有新的结果为止的主要内容,如果未能解决你的问题,请参考以下文章

while循环

流程控制语句补充

C#语言中循环分类总结

php sql条件参数为数组

php中的多条件查询

php中的多条件查询