c语言编程笔录

首页 >   > 笔记大全

笔记大全

经典的八个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函数注册一个自动加载类文件方法。当程序碰到一个未定义的类时,会自动调用该函数,并根据定义好的文件路径去寻找该类文件。