題目:
以下數組,實現這麼一個結果value=10-101-1011,label=萬達-蜘蛛俠-已購票,其實就是層級值間用字符串拼接。數組
$example=array( array( 'value'=>'10', 'label'=>'萬達', 'options'=>array( array( 'value'=>'101', 'label'=>'蜘蛛俠', 'options'=>array( array( 'value'=>'1011', 'label'=>'已購票' ) ), ), array( 'value'=>'102', 'label'=>'復仇者聯盟' ), ) ), array( 'value'=>'11', 'label'=>'紅星影城', 'options'=>array( array( 'value'=>'110', 'label'=>'速度與激情4' ), array( 'value'=>'111', 'label'=>'煎餅俠' ), ) ), );
需求:
一、無限極。
二、用遞歸的方式實現(彷佛也就只能用遞歸的方式實現,若有其餘實現方式,歡迎留言評論)。函數
一、循環數組。
二、判斷當前value值與目標值是否相等,相等時,把value值與label值記錄到新的自增加的數組裏,不等時,用continue跳過循環。
三、判斷options是否存在,不存在不作處理,存在則遞歸調用當前的方法,把options的數組,options選中的值(這裏默認選中第一個),還有2中新的數組傳回去。
四、把2中獲得的新數組循環,將value和label的值拼接並加上"-"符號,最後把多餘的"-"符號用rtrim函數去除。
五、完成,把結果返回。this
public function recursion($example,$value,$tmp=array()) { // global $tmp; 數組遞歸不回傳,這麼定義也行 foreach($example as $k=>$v){ if($value==$v['value']){ $arr['val']=$v['value']; $arr['lab']=$v['label']; $tmp[]=$arr; }else{ continue; } if($v['options']){ return $this->recursion($v['options'],$v['options'][0]['value'],$tmp); } } $val=$lab=""; if(!empty($tmp)){ foreach($tmp as $v){ $val.=$v['val'].'-'; $lab.=$v['lab'].'-'; } $val=rtrim($val,'-'); $lab=rtrim($lab,'-'); } return array('value'=>$val,'label'=>$lab); }
//調用 $res=$this->recursion($example,10); print_r($res);die; //輸出 Array ( [value] => 10-101-1011 [label] => 萬達-蜘蛛俠-已購票 )
本題是無限級分類實現層級間用字符串拼接,目前只想到用遞歸的方式實現,至因而不是隻能用遞歸的方式來實現歡迎留言評論。.net
另外一種需求,關於實現無限極分類的兩種方式,遞歸和引用,能夠了解下:點擊連接code