草庐IT

php - 从给定的父 id PHP 中查找所有子节点和孙节点

coder 2024-04-22 原文

我在推荐系统工作。 假设用户 A 邀请用户 B 和用户 C。然后用户 B 邀请用户 D,用户 C 邀请用户 E,依此类推。我如何遍历所有子节点和孙节点?

这是我数据库中的示例数据

ID       name       referral_id
1        user A     null//assume the tree starts from here
2        user B     1
3        user C     1
4        user D     2
5        user E     3

我如何创建一个函数来检索用户 A 作为父节点,然后列出用户 B(具有子节点 D)和用户 C(具有子节点 E)?

我正在使用 CI,这是我从父 ID 检索 2 个子节点的查询

$downline_query = $this->db->query("SELECT * FROM user WHERE referral_id = '1'")
//above query will return user B and C as result.. hardcoded for example

$downline = array();
foreach($downline_query as $result){
   $downline[] = array( 
       "name" => $result['name'],
       "id"   => $result['id']
   );
}
//above $downline array will only contain user B and C. I don't know where to go again after this step.. 

$records = array("data"=>$downline);
echo json_encode($records);

我不知道在这一步之后去哪里.. 已经完成了几种类型的算法,包括 while 循环和 foreach 循环。但它仍然不是那么“动态”。

请注意,我只需要所有子孙的姓名和 ID。它不一定是多维数组。只要我能得到所有的 child 、孙子和曾孙子就已经可以了..

我打算将所有的子孙等保存到 $downline 数组中。所以所有都将在 1 个数组中,没有多维数组

确实需要有关如何执行此操作的指导。以前从未做过这种层次结构的事情。谢谢 :)

最佳答案

这应该可以,假设 $downline_query 包含您需要的所有行。 IE 1 数据库查询。

$affilites = [];
$parents = []
foreach($downline_query as $row){
   if( $row['referral_id'] ){
       if( !isset(  $affilites[$row['referral_id']] ) ){
             $affilites[$row['referral_id']] = [];
       }
       $affilites[$row['referral_id']][] = $row;
   }else{
       $parents[$row['id']] = $row;
   }
}
// you now have 2 arrays 1 of parents, one of children. now just combine ( shown below )
$parent = [
    1 => ['ID'=>1,'name'=>'user A', 'referral_id' =>null],  
];

$affiliate = [
    1 => [
            ['ID'=>2,'name'=>'user B', 'referral_id' =>1],
            ['ID'=>3,'name'=>'user C', 'referral_id' =>1],
        ],
    2 => [['ID'=>4,'name'=>'user D', 'referral_id' =>2]],
    3 => [['ID'=>5,'name'=>'user E', 'referral_id' =>3]],
    5 => [['ID'=>16,'name'=>'user F', 'referral_id' =>5]],
];


print_r(getparents( $parent, $affiliate));

function getparents( $parent, $affiliate ){
    $result = [];
    foreach ($parent as $row ){
        $id = $row['ID'];

        $result[] = $row;

        if( isset($affiliate[$id]) ){
         //no children
            $result[$id]['children'] = getparents( $affiliate[$id], $affiliate ); //recurse
        }
    }
    return $result;
}

最终输出

 Array(
        [0] => Array(
                [ID] => 1
                [name] => user A
                [referral_id] =>
                [children] => Array(
                        [0] => Array(
                                [ID] => 2
                                [name] => user B
                                [referral_id] => 1
                                [children] => Array(
                                        [0] => Array(
                                                [ID] => 4
                                                [name] => user D
                                                [referral_id] => 2
                                                )

                                        )

                                )

                        [1] => Array(
                                [ID] => 3
                                [name] => user C
                                [referral_id] => 1
                                [children] => Array(
                                        [0] => Array(
                                                [ID] => 5
                                                [name] => user E
                                                [referral_id] => 3
                                                [children] => Array(
                                                        [0] => Array(
                                                                [ID] => 16
                                                                [name] => user F
                                                                [referral_id] => 5
                                                                )

                                                        )

                                                )

                                        )

                                )

                        )

                )

        ) 

关于php - 从给定的父 id PHP 中查找所有子节点和孙节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39617660/

有关php - 从给定的父 id PHP 中查找所有子节点和孙节点的更多相关文章

  1. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  2. ruby-on-rails - 跳过状态机方法的所有验证 - 2

    当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested

  3. ruby - Nokogiri 剥离所有属性 - 2

    我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog

  4. ruby - 当使用::指定模块时,为什么 Ruby 不在更高范围内查找类? - 2

    我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or

  5. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

  6. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  7. ruby-on-rails - 在 Rails 中更高效地查找或创建多条记录 - 2

    我有一个应用需要发送用户事件邀请。当用户邀请friend(用户)参加事件时,如果尚不存在将用户连接到该事件的新记录,则会创建该记录。我的模型由用户、事件和events_user组成。classEventdefinvite(user_id,*args)user_id.eachdo|u|e=EventsUser.find_or_create_by_event_id_and_user_id(self.id,u)e.save!endendend用法Event.first.invite([1,2,3])我不认为以上是完成我的任务的最有效方法。我设想了一种方法,例如Model.find_or_cr

  8. ruby - 如何遍历 Ruby 中所有正则表达式匹配的字符串? - 2

    我们有一个字符串:“”这个正则表达式://i如何从当前字符串中获取所有匹配项? 最佳答案 "".scan(//)参见scan在ruby​​-docs上 关于ruby-如何遍历Ruby中所有正则表达式匹配的字符串?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/6857852/

  9. ruby-on-rails - 在所有延迟的作业之前 Hook - 2

    是否可以在所有delayed_job任务之前运行一个方法?基本上,我们试图确保每个运行delayed_job的服务器都有我们代码的最新实例,所以我们想运行一个方法来在每个作业运行之前检查它。(我们已经有了“check”方法并在别处使用它。问题只是关于如何从delayed_job中调用它。) 最佳答案 现在有一种官方方法可以通过插件来做到这一点。这篇博文通过示例清楚地描述了如何执行此操作http://www.salsify.com/blog/delayed-jobs-callbacks-and-hooks-in-rails(本文中描述

  10. ruby - 查找重叠的正则表达式匹配项 - 2

    我想找到给定字符串中的所有匹配项,包括重叠匹配项。我怎样才能实现它?#Example"a-b-c-d".???(/\w-\w/)#=>["a-b","b-c","c-d"]expected#Solutionwithoutoverlappedresults"a-b-c-d".scan(/\w-\w/)#=>["a-b","c-d"],but"b-c"ismissing 最佳答案 在积极的前瞻中使用捕获:"a-b-c-d".scan(/(?=(\w-\w))/).flatten#=>["a-b","b-c","c-d"]参见Rubyde

随机推荐