【分享】求相对路径方法小研究
发布日期:2021-07-19 01:25:39 浏览次数:1 分类:技术文章

本文共 1027 字,大约阅读时间需要 3 分钟。

最近面试题扎堆,不少问题挺难的,今天研究了一下这个小问题,跟大家分享一下下:
题目如下:
写一个函数,算出两个文件的相对路径
  如 $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 '<br />路径b:'.$b;
  29. echo '<br />路径a和路径b的相对路径为:';
  30. echo getRelativePath($a,$b);

原文地址:

转载地址:https://blog.csdn.net/iteye_6481/article/details/82308308 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:我所知道的AJAX
下一篇:睡觉时间+1=睡着时间

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月22日 00时54分34秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

LeetCode C++ 面试题 04.03. List of Depth LCCI【Tree/BFS】中等 2019-04-28
LeetCode C++ 剑指 Offer 12. 矩阵中的路径【DFS】中等 2019-04-28
LeetCode C++ 142. Linked List Cycle II【Linked List/Two Pointers】中等 2019-04-28
LeetCode C++ 剑指 Offer 32 - II. 从上到下打印二叉树 II【Tree/BFS】简单 2019-04-28
LeetCode C++ 102. 二叉树的层序遍历【Tree/BFS】中等 2019-04-28
LeetCode C++ 372. Super Pow【Math】中等 2019-04-28
LeetCode C++ 面试题 04.05. Legal Binary Search Tree LCCI【Binary Search Tree/DFS】中等 2019-04-28
LeetCode C++ 面试题 04.06. Successor LCCI【Binary Search Tree/DFS】中等 2019-04-28
LeetCode C++ 48. Rotate Image【Array】中等 2019-04-28
LeetCode C++ 剑指 Offer 64. 求1+2+…+n【Bit Manipulation】中等 2019-04-28
LeetCode C++ 1426. Counting Elements【Array/Hash Table】简单 2019-04-28
LeetCode C++ 1469. Find All The Lonely Nodes【Tree/DFS/BFS】简单 2019-04-28
LeetCode C++ 1688. Count of Matches in Tournament【Math】简单 2019-04-28
LeetCode SQL 1683. Invalid Tweets【SELECT】简单 2019-04-28
LeetCode SQL 1693. Daily Leads and Partners【SELECT】简单 2019-04-28
【计算机网络】从零开始的个人网站1 从部署服务器到搭建简易网站 2019-04-28
LeetCode C++ 387. First Unique Character in a String【String/Hash Table】简单 2019-04-28
LeetCode C++ 1694. Reformat Phone Number【String】简单 2019-04-28
LeetCode C++ 135. Candy【Greedy】困难 2019-04-28
LeetCode C++ 316. Remove Duplicate Letters【Stack/Greedy/String】中等 2019-04-28