PHP教程

[php] 一道无限极类试题【完成2022/2/12】

本文主要是介绍[php] 一道无限极类试题【完成2022/2/12】,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

例题链接: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));

处理完了?输出顺序跟样例的有点不同【不是格式的问题~】,可能遍历算法不同吧(其实我也没有改之前的遍历方式吧~)【一次递归~~~不像链接上博主那样的哦!】

 

这篇关于[php] 一道无限极类试题【完成2022/2/12】的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!