php 面试遇到一个问题,思考出了一点门道,但是不知道该怎么写这个函数!

class前面的数字应该是对应的层级,id前面的数字,应该是就是这个ID,写出那个效果应该用什么?递归么?但是不知道怎么归!!$arr=[['1_class'=>'a',... class 前面的数字应该是对应的层级,id前面的数字,应该是就是这个ID,写出那个效果应该用什么?递归么? 但是不知道怎么归!!$arr = [ [ '1_class'=>'a', '2_class'=>'b', '3_class'=>'c', '1_id'=>1, '2_id'=>2, '3_id'=>3, ], [ '1_class'=>'a', '2_class'=>'b', '1_id'=>1, '2_id'=>2, ], [ '1_class'=>'aa', '2_class'=>'bb', '3_class'=>'cc', '1_id'=>11, '2_id'=>22, '3_id'=>33, ],]; 展开
 我来答
百度网友9308069
2018-12-18 · TA获得超过1万个赞
知道大有可为答主
回答量:3947
采纳率:89%
帮助的人:2023万
展开全部

看要求转换前和转换后的结构都有些不实用,野路子。按字面写了..

<?php //ver.>5.4.0
$arr = [ 
   ['1_class'=>'a', '2_class'=>'b', '3_class'=>'c', 
    '1_id'=>1, '2_id'=>2, '3_id'=>3 ], 
   ['1_class'=>'a', '2_class'=>'b', '1_id'=>1, '2_id'=>2, ], 
   ['1_class'=>'aa', '2_class'=>'bb', '3_class'=>'cc', 
    '1_id'=>11, '2_id'=>22, '3_id'=>33] ];
$o=[];
foreach($arr as $rec){
   $i=1; $clsKey=$i.'_class'; $cur=&$o; 
   while(array_key_exists($clsKey, $rec)) {
      $eid=$rec[$i.'_id'];
      if(!array_key_exists($clsKey, $cur))
         $cur[$eid]=['value' =>$eid, 'label'=>$rec[$clsKey], 'children'=>[]];      
      $i++; $clsKey=$i.'_class';
      $cur=&$cur[$eid]['children'];
   }
}
echo '<pre>'.print_r($o,true).'</pre>';
Array
(
    [1] => Array
        (
            [value] => 1
            [label] => a
            [children] => Array
                (
                    [2] => Array
                        (
                            [value] => 2
                            [label] => b
                            [children] => Array
                                (
                                )

                        )

                )

        )

    [11] => Array
        (
            [value] => 11
            [label] => aa
            [children] => Array
                (
                    [22] => Array
                        (
                            [value] => 22
                            [label] => bb
                            [children] => Array
                                (
                                    [33] => Array
                                        (
                                            [value] => 33
                                            [label] => cc
                                            [children] => Array
                                                (
                                                )

                                        )

                                )

                        )

                )

        )

)
雪之下雪乃LIVEJUnVO
2018-12-18 · 贡献了超过102个回答
知道答主
回答量:102
采纳率:0%
帮助的人:8万
展开全部
看不懂啊兄弟
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
夜神梦无眠
2018-12-18 · TA获得超过3357个赞
知道小有建树答主
回答量:968
采纳率:63%
帮助的人:448万
展开全部
//这么简单都不会?
   function get_children($value,$lv=1) {
        $lv ++;
        if($value[$lv.'_class']){
            $res = [
                'value'=>$value[$lv.'_id'],
                'label'=>$value[$lv.'_class'],
                'children'=>$this->get_children($value,$lv),
            ]; 
            return $res;
        }else{
            return [];
        }
    }
$arr = [ 
            [ '1_class'=>'a', '2_class'=>'b', '3_class'=>'c', '1_id'=>1, '2_id'=>2, '3_id'=>3, ], 
            [ '1_class'=>'a', '2_class'=>'b', '1_id'=>1, '2_id'=>2, ],
            [ '1_class'=>'aa', '2_class'=>'bb', '3_class'=>'cc', '1_id'=>11, '2_id'=>22, '3_id'=>33, ]
        ];
        $newlist = [];
        foreach($arr as $val){
            if($val['1_class']){
                $newlist[] = [
                    'value'=>$val['1_id'],
                    'label'=>$val['1_class'],
                    'children'=>get_children($val,1),
                ]; 
            }
        }
        var_dump($newlist);exit;
追问

这样组成的数据是这样的,实际上,第二个和第三个他们应该合并在一起。和图片的数据结构不相符~

追答
$arr = [ 
            [ '1_class'=>'a', '2_class'=>'b', '3_class'=>'c', '1_id'=>1, '2_id'=>2, '3_id'=>3, ], 
            [ '1_class'=>'a', '2_class'=>'b', '1_id'=>1, '2_id'=>2, ],
            [ '1_class'=>'aa', '2_class'=>'bb', '3_class'=>'cc', '1_id'=>11, '2_id'=>22, '3_id'=>33, ]
        ];
        $newlist = [];
        foreach($arr as $val){
            if($val['1_class']){
                $newlist[$val['1_class']]['value'] = $val['1_id'];
                $newlist[$val['1_class']]['label'] = $val['1_class'];
                $newlist[$val['1_class']]['children'][] = $this->get_children($val,1);
            }
        }
        var_dump($newlist);exit;
        //多一层套路就不会了? 老师教会你10以内的加法运算,还要教你100以内加法运算?
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式