3

题目与需求

题目:
如下数组,实现这么一个结果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] => 万达-蜘蛛侠-已购票
)

总结分析

本题是无限级分类实现层级间用字符串拼接,目前只想到用递归的方式实现,至于是不是只能用递归的方式来实现欢迎留言评论。

另一种需求,关于实现无限极分类的两种方式,递归和引用,可以了解下:点击链接


zacklee
704 声望56 粉丝