2021-08-03PHP面试笔试题记录

1、一张表中有id,pid,name三个字段。用来表示无限级联动。pid表示父级id。如无父级,则pid为0。现已将表中数据全部查出,请封装函数,实现将该数据转换成树状结构。原始数据:

$menu_datas = [
    [
    	'id' => 1,
		'pid' => 0,
		'name' => '菜单1'
	],
	[
		'id' => 2,
		'pid' => 0,
		'name' => '菜单2'
	],
	[
		'id' => 3,
		'pid' => 1,
		'name' => '菜单1下子菜单-1'
	],		
	[
		'id' => 4,
		'pid' => 2,
		'name' => '菜单2下子菜单-1'
	],
	[
		'id' => 5,
		'pid' => 2,
		'name' => '菜单2下子菜单-2'
	],
	[
		'id' => 6,
		'pid' => 3,
		'name' => '菜单1下子菜单-子菜单'
	]
];

组装后格式:

[
    [
		'id' => 1,
		'pid' => 0,
		'name' => '菜单1'
        'child' => [
            [
			    'id' => 3,
			    'pid' => 1,
			    'name' => '菜单1下子菜单-1',
                'child' => [
                    [
			            'id' => 6,
			            'pid' => 3,
			            'name' => '菜单1下子菜单-子菜单',
                        'child' => []
		            ]
                ]
		    ]		
        ]
	],
    [
		'id' => 2,
		'pid' => 0,
		'name' => '菜单2',
        'child' => [
            [
			    'id' => 4,
			    'pid' => 2,
			    'name' => '菜单2下子菜单-1',
                'child' => []
		    ],
            [
			    'id' => 5,
			    'pid' => 2,
			    'name' => '菜单2下子菜单-2',
                'child' => []
		    ]
        ]
	]
]

我的解答方案:

<?php
	$menu_datas = [
		[
			'id' => 1,
			'pid' => 0,
			'name' => '菜单1'
		],
		[
			'id' => 2,
			'pid' => 0,
			'name' => '菜单2'
		],
		[
			'id' => 3,
			'pid' => 1,
			'name' => '菜单1下子菜单-1'
		],		
		[
			'id' => 4,
			'pid' => 2,
			'name' => '菜单2下子菜单-1'
		],
		[
			'id' => 5,
			'pid' => 2,
			'name' => '菜单2下子菜单-2'
		],
		[
			'id' => 6,
			'pid' => 3,
			'name' => '菜单1下子菜单-子菜单'
		]
	];
 
	function get_tree_menu($parent_menu_datas, $menu_datas) {
		$tree_menu = [];
		
		foreach($parent_menu_datas as $parent_menu_key => $parent_menu_val) {
			// 获取菜单ID
			$parent_menu_id = $parent_menu_val['id'];
			$tree_menu[$parent_menu_key] = $parent_menu_val;
			
			// 寻找指定菜单ID的下一级菜单的所有数据内容
			$next_level_menus = [];
			foreach($menu_datas as $next_level_menu) {
				if($next_level_menu['pid'] == $parent_menu_id) {
					$next_level_menus[] = $next_level_menu;
				}
			}
			
			if(!empty($next_level_menus)) {
				$tree_menu[$parent_menu_key]['child'] = get_tree_menu($next_level_menus, $menu_datas);
			} else {
				$tree_menu[$parent_menu_key]['child'] = [];
			}			
		}
		
		return $tree_menu;
	}
 
	$first_level_datas = [];
	foreach($menu_datas as $menu_data) {
		if($menu_data['pid'] == 0) {
			array_push($first_level_datas, $menu_data);
		}
	}
 
	// print_r($first_level_datas);
 
	$result = get_tree_menu($first_level_datas, $menu_datas);
 
	print_r($result);
?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值