共计 1380 个字符,预计需要花费 4 分钟才能阅读完成。
题目与需求
题目:
如下数组,实现这么一个结果 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'=>'煎饼侠' | |
), | |
) | |
), | |
); |
需求:
1、无限极。
2、用递归的方式实现(似乎也就只能用递归的方式实现,如有其他实现方式,欢迎留言评论)。
实现步骤
1、循环数组。
2、判断当前 value 值与目标值是否相等,相等时,把 value 值与 label 值记录到新的自增长的数组里,不等时,用 continue 跳过循环。
3、判断 options 是否存在,不存在不做处理,存在则递归调用当前的方法,把 options 的数组,options 选中的值(这里默认选中第一个),还有 2 中新的数组传回去。
4、把 2 中得到的新数组循环,将 value 和 label 的值拼接并加上 ”-“ 符号,最后把多余的 ”-“ 符号用 rtrim 函数去除。
5、完成,把结果返回。
代码示例
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] => 万达 - 蜘蛛侠 - 已购票 | |
) |
总结分析
本题是无限级分类实现层级间用字符串拼接,目前只想到用递归的方式实现,至于是不是只能用递归的方式来实现欢迎留言评论。
另一种需求,关于实现无限极分类的两种方式,递归和引用,可以了解下:点击链接
正文完