经典的八个PHP高级工程面试题附答案
更新时间:2023-10-06问题一:多维数组排序
给定一个多维数组,要求按指定字段进行排序,如果字段相同,则根据某个子字段进行排序。
$data = [ ['id' => 1, 'name' => '张三', 'age' => 20], ['id' => 2, 'name' => '李四', 'age' => 20], ['id' => 3, 'name' => '王五', 'age' => 24], ['id' => 4, 'name' => '赵六', 'age' => 22], ['id' => 5, 'name' => '钱七', 'age' => 22], ]; //按年龄降序、id升序排序 $sort = array_column($data, 'age'); array_multisort($sort, SORT_DESC, $data); $sort = array_column($data, 'id'); array_multisort($sort, SORT_ASC, $data);
使用array_multisort函数进行多维数组排序,先按指定字段升序或降序排列,然后再按照某个子字段升序或者降序排列。
问题二:生成树形结构数组
某个业务需要将平铺的数据转化为树状数据结构,把相同id的数据归为一组,并且排列层级。
$data = [ ['id' => 1, 'name' => '家电', 'parent_id' => 0], ['id' => 2, 'name' => '手机', 'parent_id' => 1], ['id' => 3, 'name' => '电视', 'parent_id' => 1], ['id' => 4, 'name' => '笔记本电脑', 'parent_id' => 1], ['id' => 5, 'name' => '声音', 'parent_id' => 0], ['id' => 6, 'name' => '麦克风', 'parent_id' => 5], ['id' => 7, 'name' => '音响', 'parent_id' => 5], ['id' => 8, 'name' => '零食', 'parent_id' => 0], ['id' => 9, 'name' => '巧克力', 'parent_id' => 8], ['id' => 10, 'name' => '薯片', 'parent_id' => 8], ['id' => 11, 'name' => '饮料', 'parent_id' => 0], ['id' => 12, 'name' => '可乐', 'parent_id' => 11], ['id' => 13, 'name' => '雪碧', 'parent_id' => 11], ['id' => 14, 'name' => '绿茶', 'parent_id' => 11], ['id' => 15, 'name' => '花茶', 'parent_id' => 11], ]; function getTree($data, $parentId = 0) { $tree = array(); foreach ($data as $k => $v) { if ($v['parent_id'] == $parentId) { $v['children'] = getTree($data, $v['id']); if (empty($v['children'])) { unset($v['children']); } $tree[] = $v; unset($data[$k]); } } return $tree; }
使用递归的方式把相同id的数据归为一组,并且嵌套成树形结构数组。
问题三:实现一个无限极分类
给定一组有层级关系的分类数据,要求实现一个分类方法,使得可以按照一定规则将该层级数据分类,再返回分类后的数组。
$arr = [ ['id' => 1, 'pid' => 0, 'name' => '电器'], ['id' => 2, 'pid' => 1, 'name' => '手机'], ['id' => 3, 'pid' => 1, 'name' => '笔记本'], ['id' => 4, 'pid' => 2, 'name' => '苹果手机'], ['id' => 5, 'pid' => 2, 'name' => '华为手机'], ['id' => 6, 'pid' => 3, 'name' => '戴尔笔记本'], ['id' => 7, 'pid' => 3, 'name' => '华为笔记本'], ]; function tree($data, $pid = 0) { $tree = []; foreach ($data as $k => $v) { if ($v['pid'] == $pid) { $v['child'] = tree($data, $v['id']); $tree[] = $v; } } return $tree; }
使用递归的方式把相同pid的数据归为一组,并且嵌套成树形结构数组。
问题四:实现自动加载类文件
当程序遇到一个类未被定义时,需要实现自动加载该类文件,使程序能正常运行。当然,这一个类文件可能被放在多个目录里。
spl_autoload_register(function ($className) { $classFile = str_replace('\\', DIRECTORY_SEPARATOR, $className) . '.php'; $includePaths = array( __DIR__ . DIRECTORY_SEPARATOR . $classFile, __DIR__ . DIRECTORY_SEPARATOR . 'lib' . DIRECTORY_SEPARATOR . $classFile, __DIR__ . DIRECTORY_SEPARATOR . 'test' . DIRECTORY_SEPARATOR . $classFile ); foreach ($includePaths as $path) { if (file_exists($path)) { include $path; break; } } });
使用spl_autoload_register函数注册一个自动加载类文件方法。当程序碰到一个未定义的类时,会自动调用该函数,并根据定义好的文件路径去寻找该类文件。