例题链接:https://www.cnblogs.com/bndong/p/12762990.html
一道无限极类试题
注意:
1、※ 函数里嵌套函数,小心变量的命名,就近原则一不小心就访问到不该访问的变量
2、※ 巧用引用~
输入:
$arr = [ '小红' => [ '张三' => null, '李四' => [ '东东' => [ '一一' => null, '二二' => [ '小明' => null ] ], '西西' => null, ], ], '小绿' => [ '王五' => null, '赵六' => [ '南南' => null, ], '孙七' => [ '北北' => null ] ], '小蓝' => null ];
输出:
小红: 张三,李四,东东,西西,一一,二二,小明 张三: 无 李四: 东东,西西,一一,二二,小明 东东: 一一,二二,小明 一一: 无 二二: 小明 小明: 无 西西: 无 小绿: 王五,赵六,孙七,南南,北北 王五: 无 赵六: 南南 南南: 无 孙七: 北北 北北: 无 小蓝: 无
思路1:暴力递归!(干就完事)
实现:先遍历递归一遍数组,将同级键值索引从底部带上来,并将无所属元素保存
<?php $arr = [ '小红' => [ '张三' => null, '李四' => [ '东东' => [ '一一' => null, '二二' => [ '小明' => null ] ], '西西' => null, ], ], '小绿' => [ '王五' => null, '赵六' => [ '南南' => null, ], '孙七' => [ '北北' => null ] ], '小蓝' => null ]; function getUserStr(array $arr){ $container=[];//储存变量 //返回数组,['&'=>同级元素字符串, function coreFunc($arr){ $indexs=null;//同级键字符串【"&"并列分割】 $containers=array();//元素键=>值【无所属元素键与值】 foreach($arr as $index =>$value){ $indexs.=(is_null($indexs)?$index:"&".$index); if(is_array($value)){ $containers=dealInputAndOutputFormat($value,$index); }else{ $containers[$index]=$value; } } return array_merge_recursive(["&"=>$indexs],$containers); } //处理输入和输出到coreFunc的数组格式。 function dealInputAndOutputFormat($value,$index){ $tmp=coreFunc($value); $container[$index]=$tmp["&"]; unset($tmp["&"]); return array_merge_recursive($container,$tmp); } foreach($arr as $index =>$value){ if(is_array($value)){ $container=array_merge_recursive($container,dealInputAndOutputFormat($value,$index)); }else{ $container[$index]=$value; } } $str=""; //拼接输出字符串 foreach($container as $index =>$value){ $str.=$index.":".($value?$value:"空")."<br>"; } return $str; // } print_r(getUserStr($arr));
有点问题!上下级的元素键带不上来,得换一种遍历方式了,将遍历时键值串在一起往下遍历~
2、
<?php $arr = [ '小红' => [ '张三' => null, '李四' => [ '东东' => [ '一一' => null, '二二' => [ '小明' => null ] ], '西西' => null, ], ], '小绿' => [ '王五' => null, '赵六' => [ '南南' => null, ], '孙七' => [ '北北' => null ] ], '小蓝' => null ]; function getUserStr1(array $arr){ $container=[];//储存变量 function dealNull($value){//处理空数值 return (is_null($value) || ""==$value)?"空":$value; } //返回数组:['&'=>同级元素字符串,[其他非所属元素的键值] ] function coreFunc($arr,&$code):Array{//核心遍历数组,提取同级关系 $indexs=null;//同级键字符串【"&"并列分割】 $containers=array();//元素键=>值【无所属元素键与值】 foreach($arr as $index =>$value){//遍历数组 $indexs.=(is_null($indexs)?$index:",".$index);//记录同级字符串 $code.=",".$index;//记录跨级键值 if(is_array($value)){ $containers+=dealInputAndOutputFormat($value,$index,$code);//递归 }else{ $containers[$index]=$value;//获取键值 } } return [","=>$indexs]+$containers; } //处理输入和输出到coreFunc的数组格式。并与container变量互动 function dealInputAndOutputFormat($value,$index,&$code):Array{ $tmp1=coreFunc($value,$code); //跨级字段处理!! $cod=substr($code,strpos($code,explode(",",$tmp1[','])[0])); $tmp2=["{$index}"=>$cod];unset($tmp1[","]);//处理所属问题 return $tmp2+$tmp1; } foreach($arr as $index =>$value){ if(is_array($value)){ $in=$index; $container+=dealInputAndOutputFormat($value,$index,$in); $container[$index]=substr($in,7); }else{ $container[$index]=$value; } } //拼接输出字符串 var_dump($container); $str="";foreach($container as $index =>$value){ $str.=$index.":".dealNull($value)."<br>"; } return $str; } print_r(getUserStr1($arr));
处理完了?输出顺序跟样例的有点不同【不是格式的问题~】,可能遍历算法不同吧(其实我也没有改之前的遍历方式吧~)【一次递归~~~不像链接上博主那样的哦!】