大家帮研究个算法,类似菜单的。

cs_993 2018-06-04 05:34:17
数据结构大概是这样的。

$data[] = array('id'=>"1601");
$data[] = array('id'=>"160101");
$data[] = array('id'=>"160102");
$data[] = array('id'=>"16010201");
$data[] = array('id'=>"1601020101");
$data[] = array('id'=>"1601020102");
$data[] = array('id'=>"160103");
$data[] = array('id'=>"16010301");


1601 属于一级项目,以一级项目的id开头的,例如160101 160102…属于1601的二级项目,以此类推。

算法结果应该为:

array(
'1601' => array(
'id' => '1601',
'child' => array(
'160101' => array(
'id' => '160101',
),
'160102' => array(
'id' => '160102',
'child' => array(
'16010201' => array(
'id' => '16010201',
'child' => array(
'1601020101' => array(
'id' => '1601020101',
),
'1601020102' => array(
'id' => '1601020102',
)
)
)
)
),
'160103' => array(
'id' => '160103',
'child' => array(
'16010301' => array(
'id' => '16010301',
),
)
),
)
)
)

...全文
442 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
cs_993 2018-06-05
  • 打赏
  • 举报
回复

	public function searchTree($data){
		foreach($data as $key => $item){
			$data[$item['id']] = $item;
		}
		$temp2 = array();
		foreach($data as $key => $item){
			if(strlen($item['id']) == 4){
				$temp2[$item['id']] = $item;
				$temp2[$item['id']]['child'] = $this->getchild($data ,$item['id']);
			}
		}
		return $temp2;
	}
	public function getchild($data ,$searchkey){
		$temp = array();
		foreach($data as $key => $item){
			if(strpos($data[$key]['id'] ,$searchkey) === 0 and (strlen($data[$key]['id'])-strlen($searchkey) === 2)){
				$temp[$data[$key]['id']] = $data[$key]; 
				$temp[$data[$key]['id']]['child'] = $this->getchild($data ,$data[$key]['id']);
			}
		}
		return $temp;
	}
自己研究出来了。还是感谢两位!
cs_993 2018-06-05
  • 打赏
  • 举报
回复
引用 2 楼 xuzuning 的回复:
$data[] = array('id'=>"1601");
$data[] = array('id'=>"160101");
$data[] = array('id'=>"160102");
$data[] = array('id'=>"16010201");
$data[] = array('id'=>"1601020101");
$data[] = array('id'=>"1601020102");
$data[] = array('id'=>"160103");
$data[] = array('id'=>"16010301");

$res = [];
foreach($data as $v) {
  $k = $v['id'];
  $res[$k] = $v;
  $k1 = substr($k, 0, -2); 
  $res[$k1]['child'][$k] =& $res[$k];
}
print_r(array_slice($res, 0, 1, true));

Array
(
    [1601] => Array
        (
            [id] => 1601
            [child] => Array
                (
                    [160101] => Array
                        (
                            [id] => 160101
                        )

                    [160102] => Array
                        (
                            [id] => 160102
                            [child] => Array
                                (
                                    [16010201] => Array
                                        (
                                            [id] => 16010201
                                            [child] => Array
                                                (
                                                    [1601020101] => Array
                                                        (
                                                            [id] => 1601020101
                                                        )

                                                    [1601020102] => Array
                                                        (
                                                            [id] => 1601020102
                                                        )

                                                )

                                        )

                                )

                        )

                    [160103] => Array
                        (
                            [id] => 160103
                            [child] => Array
                                (
                                    [16010301] => Array
                                        (
                                            [id] => 16010301
                                        )

                                )

                        )

                )

        )

)
方法可实现,但是只针对给出的数据,如果id有其他例如1111就会出问题。
cs_993 2018-06-05
  • 打赏
  • 举报
回复
引用 1 楼 yt_php 的回复:
$data[] = array('id'=>"1601"); $data[] = array('id'=>"1602"); $data[] = array('id'=>"160101"); $data[] = array('id'=>"160102"); $data[] = array('id'=>"16010201"); $data[] = array('id'=>"1601020101"); $data[] = array('id'=>"1601020102"); $data[] = array('id'=>"160103"); $data[] = array('id'=>"16010301"); foreach ($data as $k => $v) { $arr[ $v['id'] ] = $v; } foreach ($arr as $k => &$v) { for($i=1;$i<100;$i++) { $oo = $i<10?'0'.$i:$i; $sub_k = $k.$oo; if( isset( $arr[$sub_k] ) ) { $v['child'][$sub_k] = &$arr[$sub_k]; $temp[] = $sub_k; } } } for($i=0;$i<count($temp);$i++){ unset($arr[$temp[$i]]); } echo "<pre>"; print_r($arr); Array ( [1601] => Array ( [id] => 1601 [child] => Array ( [160101] => Array ( [id] => 160101 ) [160102] => Array ( [id] => 160102 [child] => Array ( [16010201] => Array ( [id] => 16010201 [child] => Array ( [1601020101] => Array ( [id] => 1601020101 ) [1601020102] => Array ( [id] => 1601020102 ) ) ) ) ) [160103] => Array ( [id] => 160103 [child] => Array ( [16010301] => Array ( [id] => 16010301 ) ) ) ) ) [1602] => Array ( [id] => 1602 ) )
方法可实现,但是for 100 不是很好的办法。
xuzuning 2018-06-05
  • 打赏
  • 举报
回复
$data[] = array('id'=>"1601");
$data[] = array('id'=>"160101");
$data[] = array('id'=>"160102");
$data[] = array('id'=>"16010201");
$data[] = array('id'=>"1601020101");
$data[] = array('id'=>"1601020102");
$data[] = array('id'=>"160103");
$data[] = array('id'=>"16010301");

$res = [];
foreach($data as $v) {
  $k = $v['id'];
  $res[$k] = $v;
  $k1 = substr($k, 0, -2); 
  $res[$k1]['child'][$k] =& $res[$k];
}
print_r(array_slice($res, 0, 1, true));

Array
(
    [1601] => Array
        (
            [id] => 1601
            [child] => Array
                (
                    [160101] => Array
                        (
                            [id] => 160101
                        )

                    [160102] => Array
                        (
                            [id] => 160102
                            [child] => Array
                                (
                                    [16010201] => Array
                                        (
                                            [id] => 16010201
                                            [child] => Array
                                                (
                                                    [1601020101] => Array
                                                        (
                                                            [id] => 1601020101
                                                        )

                                                    [1601020102] => Array
                                                        (
                                                            [id] => 1601020102
                                                        )

                                                )

                                        )

                                )

                        )

                    [160103] => Array
                        (
                            [id] => 160103
                            [child] => Array
                                (
                                    [16010301] => Array
                                        (
                                            [id] => 16010301
                                        )

                                )

                        )

                )

        )

)
yt_php 2018-06-04
  • 打赏
  • 举报
回复
$data[] = array('id'=>"1601"); $data[] = array('id'=>"1602"); $data[] = array('id'=>"160101"); $data[] = array('id'=>"160102"); $data[] = array('id'=>"16010201"); $data[] = array('id'=>"1601020101"); $data[] = array('id'=>"1601020102"); $data[] = array('id'=>"160103"); $data[] = array('id'=>"16010301"); foreach ($data as $k => $v) { $arr[ $v['id'] ] = $v; } foreach ($arr as $k => &$v) { for($i=1;$i<100;$i++) { $oo = $i<10?'0'.$i:$i; $sub_k = $k.$oo; if( isset( $arr[$sub_k] ) ) { $v['child'][$sub_k] = &$arr[$sub_k]; $temp[] = $sub_k; } } } for($i=0;$i<count($temp);$i++){ unset($arr[$temp[$i]]); } echo "<pre>"; print_r($arr); Array ( [1601] => Array ( [id] => 1601 [child] => Array ( [160101] => Array ( [id] => 160101 ) [160102] => Array ( [id] => 160102 [child] => Array ( [16010201] => Array ( [id] => 16010201 [child] => Array ( [1601020101] => Array ( [id] => 1601020101 ) [1601020102] => Array ( [id] => 1601020102 ) ) ) ) ) [160103] => Array ( [id] => 160103 [child] => Array ( [16010301] => Array ( [id] => 16010301 ) ) ) ) ) [1602] => Array ( [id] => 1602 ) )

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧