1. 程式人生 > 其它 >[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));

處理完了?輸出順序跟樣例的有點不同【不是格式的問題~】,可能遍歷演算法不同吧(其實我也沒有改之前的遍歷方式吧~)【一次遞迴~~~不像連結上博主那樣的哦!】