看了网友 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
反正这些数据测试起来都没问题,有问题的同学可以下方评论,一起交流