[php] 一道无限极类试题【完成2022/2/12】
例题链接:
一道无限极类试题
注意:
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:"空")."
";
}
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)."
";
}
return $str;
}
print_r(getUserStr1($arr));
处理完了?输出顺序跟样例的有点不同【不是格式的问题~】,可能遍历算法不同吧(其实我也没有改之前的遍历方式吧~)【一次递归~~~不像链接上博主那样的哦!】