Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1647981
  • 博文数量: 1481
  • 博客积分: 26784
  • 博客等级: 上将
  • 技术积分: 17045
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-12 09:22
文章分类

全部博文(1481)

文章存档

2014年(10)

2013年(353)

2012年(700)

2011年(418)

分类: 系统运维

2012-04-13 09:21:49

最近面试题扎堆,不少问题挺难的,今天研究了一下这个小问题,跟大家分享一下下:
题目如下:
写一个函数,算出两个文件的相对路径
  如 $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';有不少答案都是采用循环数组找不同元素时用../来拼接解决,这样的后面有相同目录就会出错了。好了废话就不说了,奉上我写的方法,难免有不足哈,望大家指点!
  1. /**
  2. * 求两路径的相对路径
  3. * @param string $patha 路径a
  4. * @param string $pathb 路径b
  5. * @return string 相对路径
  6. */
  7. function getRelativePath($patha,$pathb){
  8. $arr_a=explode('/',trim(dirname($patha),'/'));
  9. $arr_b=explode('/',trim(dirname($pathb),'/'));
  10. $n=min(count($arr_a),count($arr_b));//用最短路径来循环
  11. $flag=true;//标记位[标记是否完全没有交集]
  12. for($i=0;$i<$n;$i++){
  13. if($arr_a[$i]==$arr_b[$i]){
  14. unset($arr_a[$i],$arr_b[$i]);//去除前面相同的部分
  15. }else{
  16. if($i==0)
  17. $flag=false;//两路径没有交集
  18. break;//停止循环
  19. }
  20. }
  21. $str=$flag?str_repeat('../',count($arr_b)+1):'/';//没有交集则为根目录[Linux情况,windows自己改]
  22. return $str.join('/',$arr_a);//拼接并返回
  23. }
  24. //TEST
  25. $a ='/a/b/c/d/e.php';
  26. $b ='/a/b/12/34/c.php';
  27. echo '路径a:'.$a;
  28. echo '
    路径b:'.$b;
  29. echo '
    路径a和路径b的相对路径为:';
  30. echo getRelativePath($a,$b);

原文地址:

阅读(309) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~