最近解决了一次有限分类的数据,次要是用到了递归函数,当然laravel有更优雅的关联查问方法,不过因为数据须要有很多其余二次批改,于是采纳了原生的递归解决,同时对于递归的原理,采纳一个形象的比喻来阐明:
(外围思路:递归有去有回)

官网阐明

递归函数即自调用函数,也就是函数在函数体外部间接或间接地本人调用本人。须要留神的是应用递归函数时通常会在函数体中附加一个判断条件,以判断是否须要继续执行递归调用,当条件满足时会终止函数的递归调用。

背景阐明

忽然的一天,现任女友发现你还和以前的一些女性朋友保持联系,并且找到了一份证据摆到你的背后,让你解释一下你跟他们之间的关系,相干证据如下:

<?php//出处:https://www.dongyao.ren/$arr = [    [        'id' =>1,        'pid'=>0,        'name' => '前女友'    ],    [        'id' =>2,        'pid'=>1,        'name' =>'二毛'    ],    [        'id' =>3,        'pid'=>0,        'name' =>'可疑人员'    ],    [        'id' =>4,        'pid'=>2,        'name' =>'小红'    ],    [        'id' =>5,        'pid'=>2,        'name' =>'小绿'    ],    [        'id' =>6,        'pid'=>3,        'name' =>'共事'    ],    [        'id' =>7,        'pid'=>1,        'name' =>'大毛'    ],    [        'id' =>8,        'pid'=>3,        'name' =>'同学'    ]];

相干证人

现任女友严格发话了,你本人交代结果可能会好一点,要不然她就要去问上面这个证人敌人了:

<?php//出处:https://www.dongyao.ren/getMenu($menus_main,$parent_id=0,$sub='children',$level=1){        $data = array();        foreach($menus_main as $key=>$val){            if($val['parent_id']==$parent_id){                $val['level']=$level;                $val[$sub]=$this->getMenu($menus_main,$val['id'],$sub,$level+1);                $data[] = $val;            }        }        return $data;    }

被动交代

以下是这些名单的关系图谱,目前曾经一头冷汗了

回顾一下细节吧

现任要求你讲述一下跟这些人的意识细节,曾经证据确凿了,就别硬撑了
把方才那个证人来过去一起回顾一下,通过探讨,确定了一个思路,如下:

<?php//出处:https://www.dongyao.ren/function getMenu($menus_main,$pid=0,$sub='children',$level=1,$name = '主栏目'){    $data = array();    foreach($menus_main as $key=>$val){                echo "正在第".$level."层排查第".$val['id']."号人物(Pid:".$val['pid']."):<span style='color:red'><b>".$val['name']."</b></span>属于【".$name."】---此时data值".json_encode($data,JSON_UNESCAPED_UNICODE);                if($val['pid']==$pid){            echo "<span style='color:green'>:证据确凿,持续排查".($level+1)."层</span><hr>";            $val['level']=$level;            // unset($menus_main[$key]);            $val[$sub]=getMenu($menus_main,$val['id'],$sub,$level+1,$val['name']);            $data[] = $val;        }else{            if($val['id'] == $pid){                echo "<span style='color:red'>---条件不满足【本人查本人】,开始返回---</span><hr>";            }else{                echo "<span style='color:red'>---条件不满足【不是同一类】,开始返回---</span><hr>";            }                    }            }    return $data;}

失去了具体的聊天过程如下:


……还有好多没列出来

内容过多,一口气说不完,说重点

相干过程

对照关系图谱和这一份聊天记录能够看到:

因为过程比拟缓和,手抖画的图,大略意思就是这么一个简化图
  • 首先对号人物前女友进行排查,确定这是个大号人物。此时因为不确定这个小人物上面还有没有其余相干人物,所以,先放在待定区此时$data变量还未赋值
  • 第二轮就是排查所有人是不是都跟前女友有关系,一个一个审讯之后,临时排除无关人员;
  • 刚开始就遇上本人查本人的状况,跳过,该人物第一步曾经确定了
  • 第二位二毛进入眼帘了,确定跟前女友无关,满足考察条件,此时二毛前面的人员,先原地期待不要动,等查完二毛再解决
  • 此时进入考察二毛的关系链工作中,持续把8位关键人物拉过来,询问是否跟二毛有关系
  • 问到小红这里,发现小红是二毛的孩子,满足考察条件, 持续把8位关键人物拉过来,询问是否跟小红有关系
  • 发现没有人跟小红有关系了,此时就把小红二毛孩子的信息标记到$data变量当中
到这一步,其中一条关系链曾经考察革除,赋值$data,以后只有小红一人被标记赋值,以后其余关系链的相干人物还在期待考察,持续往下看:
  • 回过头去,持续到上次中断考察的地位,从小红往后持续考察,而后发现了小绿也是二毛的孩子,后续工作跟小红一样。
  • 得出小绿没有关联人物了,退出以后关系链,将调查结果追加到上一步的前面
此时,$data变量当中蕴含两个人物了,有小红,还有小绿,后续工作持续
  • 回到上次中断的地位,$data以后蕴含二毛和两个孩子的总信息,而后持续从二毛前面考察,发现大毛也是前女友营垒的,后续关系链考察跟二毛一样:
一圈考察下来,发现大毛还算简略,没有孩子,完结对他的考察,把大毛的调查结果,记录在$data当中,此时data变量蕴含了大毛和二毛,以及他们的孩子关系信息。

……
后续其余关系链的逻辑同上,反反复复,一个一个的审讯考察,发现可疑就临时中断,后续的,顺着可疑人员排查上来,排查完之后,注销排查后果,回过头再来从中断地位持续深挖上来,如此重复。

证据链

下方是本次过程的所有代码,各位能够自行执行参阅
<?php//出处:https://www.dongyao.ren/function getMenu($menus_main,$pid=0,$sub='children',$level=1,$name = '主栏目'){    $data = array();    foreach($menus_main as $key=>$val){                echo "正在第".$level."层排查第".$val['id']."号人物(Pid:".$val['pid']."):<span style='color:red'><b>".$val['name']."</b></span>属于【".$name."】---此时data值".json_encode($data,JSON_UNESCAPED_UNICODE);                if($val['pid']==$pid){            echo "<span style='color:green'>:证据确凿,持续排查".($level+1)."层</span><hr>";            $val['level']=$level;            // unset($menus_main[$key]);            $val[$sub]=getMenu($menus_main,$val['id'],$sub,$level+1,$val['name']);            $data[] = $val;        }else{            if($val['id'] == $pid){                echo "<span style='color:red'>---条件不满足【本人查本人】,开始返回---</span><hr>";            }else{                echo "<span style='color:red'>---条件不满足【不是同一类】,开始返回---</span><hr>";            }                    }            }    return $data;}$arr = [    [        'id' =>1,        'pid'=>0,        'name' => '前女友'    ],    [        'id' =>2,        'pid'=>1,        'name' =>'二毛'    ],    [        'id' =>3,        'pid'=>0,        'name' =>'可疑人员'    ],    [        'id' =>4,        'pid'=>2,        'name' =>'小红'    ],    [        'id' =>5,        'pid'=>2,        'name' =>'小绿'    ],    [        'id' =>6,        'pid'=>3,        'name' =>'共事'    ],    [        'id' =>7,        'pid'=>1,        'name' =>'大毛'    ],    [        'id' =>8,        'pid'=>3,        'name' =>'同学'    ]];getMenu($arr);return;

AD

欢送拜访博客:https://www.dongyao.ren