[php] 一道無限極類試題【完成2022/2/12】
阿新 • • 發佈:2022-02-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));
處理完了?輸出順序跟樣例的有點不同【不是格式的問題~】,可能遍歷演算法不同吧(其實我也沒有改之前的遍歷方式吧~)【一次遞迴~~~不像連結上博主那樣的哦!】