PHP面试题,计算两个文件之间的相对路径方法

看了网友 https://blog.csdn.net/fdipzone/article/details/27261751 的代码,很精简,而且测试结果也很满意

先看题目吧:

例如:

文件A 的路径是 /home/web/lib/img/cache.php

文件B的路径是 /home/web/api/img/show.php

那么,文件A相对于文件B的路径是 ../../lib/img/cache.php,即文件B 访问 文件A的相对路径。

 

上代码

function getRelativePath($pathA, $pathB)
{
    $arrA = explode('/', $pathA);
    $arrB = explode('/', $pathB);

    $inter = array_intersect_assoc($arrA, $arrB);

    $depth = 1;
    for ($i = 1, $len = count($inter); $i <= $len; $i++) {

        $depth = $i;

        if (!isset($inter[$i])) {
            break;
        }
    }

    $bLen = count($arrB) - $depth - 1;
    if ($bLen > 0) {
        $prefix = array_fill(0, $bLen, '..');
    } else {
        $prefix = array('.');
    }

    $tmp = array_merge($prefix, array_slice($arrA, $depth));

    $relativePath = implode('/', $tmp);
 
    return $relativePath;
}

看代码量觉得很简单,但是面试的时候这道题还有友情提示,说历史正确率只有25%。。。。。所以读完代码给各位出一个保姆级注释,不理解光背代码的话,以后再遇到还是感觉很模糊。上代码

function getRelativePath($pathA, $pathB)
{
    $arrA = explode('/', $pathA);
    $arrB = explode('/', $pathB);

    // 获取相同路径的部分,相同路径只计算前几个相同,要保证位置和名字都相同
    $inter = array_intersect_assoc($arrA, $arrB);

    //预定义$arr1的切割深度,切割$arr1后作为最后字符串的右边拼接,如下面的array_slice部分
    //为什么要切割?因为绝对路径的结果中,是不需要出现前面完全相同的目录的。
    //步长为1是因为explode后的$arr1第一位是空字符串,可以打印一下
    $depth = 1;

    for ($i = 1, $len = count($inter); $i <= $len; $i++) {
        //此处计算切割深度
        $depth = $i;

        //这一步是因为array_intersect_assoc的结果会有不连续key,如下
        //array(4) {
        //  [0]=>
        //  string(0) ""
        //  [1]=>
        //  string(4) "home"
        //  [2]=>
        //  string(3) "web"
        //  [4]=>
        //  string(3) "img"
        //}
        if (!isset($inter[$i])) {
            break;
        }
    }


    //这个是计算出字符串左边应该给几个'..'。
    //几个'..'取决于B的减掉切割深度以后,再减去B的文件所在的目录后剩余的目录个数
    //如下
    //   /home/web/lib/img/cache.php
    //   /home/web/api/show.php
    //去掉/home/web/和show.php的目录后 就剩一个api目录了。这一个api就替换为一个'..'
    $bLen = count($arrB) - $depth - 1;

    //这里判断一下如果>0 说明如上面描述的还有目录,直接替换为'..',剩余几个就给perfix补充几个'..'
    if ($bLen > 0) {
        $prefix = array_fill(0, $bLen, '..');
    } else {

        //否则说明文件和相对目录在一起。如下情况
        //  /home/web/lib/img/cache.php
        //  /home/web/show.php
        $prefix = array('.');
    }

    //当你看了上面的注释,这里就不用多啥了吧。
    $tmp = array_merge($prefix, array_slice($arrA, $depth));

    $relativePath = implode('/', $tmp);
 
    return $relativePath;
}

测试数据

$path1 = '/home/web/lib/img/cache.php';
$path2 = '/home/show.php';
echo getRelativePath($path1, $path2) . '\r'; // ./web/lib/img/cache.php

$path1 = '/home/web/lib/img/cache.php';
$path2 = '/home/web/api/show.php';
echo getRelativePath($path1, $path2) . '\r'; // ../lib/img/cache.php
//
$path1 = '/home/web/lib/img/cache.php';
$path2 = '/home/web/api/img/show.php';
echo getRelativePath($path1, $path2) . '\r'; // ../../lib/img/cache.php
//
$path1 = '/home/web/lib/img/cache.php';
$path2 = '/xhome/web/show.php';
echo getRelativePath($path1, $path2) . '\r'; // ../../home/web/lib/img/cache.php

反正这些数据测试起来都没问题,有问题的同学可以下方评论,一起交流

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值