最近面试题扎堆,不少问题挺难的,今天研究了一下这个小问题,跟大家分享一下下:
题目如下:
写一个函数,算出两个文件的相对路径
如 $a = '/a/b/c/d/e.php';
$b =
'/a/b/12/34/c.php';
计算出 $b 相对于 $a 的相对路径应该是
../../c/d
看了很多答案,发现都有小问题,比如$a='/a/b/c/d/e/f/n.php';,$b='/a/b/c/34/gg/a/b/c/g.php';有不少答案都是采用循环数组找不同元素时用../来拼接解决,这样的后面有相同目录就会出错了。好了废话就不说了,奉上我写的方法,难免有不足哈,望大家指点!
- /**
- * 求两路径的相对路径
- * @param string $patha 路径a
- * @param string $pathb 路径b
- * @return string 相对路径
- */
- function getRelativePath($patha,$pathb){
- $arr_a=explode('/',trim(dirname($patha),'/'));
- $arr_b=explode('/',trim(dirname($pathb),'/'));
- $n=min(count($arr_a),count($arr_b));//用最短路径来循环
- $flag=true;//标记位[标记是否完全没有交集]
- for($i=0;$i<$n;$i++){
- if($arr_a[$i]==$arr_b[$i]){
- unset($arr_a[$i],$arr_b[$i]);//去除前面相同的部分
- }else{
- if($i==0)
- $flag=false;//两路径没有交集
- break;//停止循环
- }
- }
- $str=$flag?str_repeat('../',count($arr_b)+1):'/';//没有交集则为根目录[Linux情况,windows自己改]
- return $str.join('/',$arr_a);//拼接并返回
- }
- //TEST
- $a ='/a/b/c/d/e.php';
- $b ='/a/b/12/34/c.php';
- echo '路径a:'.$a;
- echo '
路径b:'.$b;
- echo '
路径a和路径b的相对路径为:';
- echo getRelativePath($a,$b);
原文地址:
阅读(309) | 评论(0) | 转发(0) |