博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一道PHP面试题,求两个文件的相对路径
阅读量:4095 次
发布时间:2019-05-25

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

首先原题是这样子的:

写一个函数,计算出两个文件的相对路径,如 $a = '/a/b/c/d/d.php',$b = '/a/b/1/2/c.php'

计算出的$b相对于$a的相对路径应该是:../../c/d

那么对于网上给出的答案,看了看貌似只能针对题目中给出的那个路径来计算,如果路径一变化,类似下面这样,那么那些程序好像没用了,当然有些是有用,但是还是报一些警告出来。。。。。

例如:

$a = '/a/b/c/d/e/f/g/h/e.php'

$b = '/a/b/1/2/c.php'

再例如:

$a = '/a/e.php'

$b = '/a/b/c/d/1/2/c.php'

再例如:

$a = '/a/b/c/d/d.php'

$b = '/a/b/c/d/c.php'

所以这个情况挺多的,不能仅仅看当下的需求!

首先还是说下这个题目的意图吧,它的要求是求$b相对于$a的一个相对路径,也就是说是个什么意思呢。

就是从$b所给定的那个文件通过相对路径的方式表示怎么样可以找到$a所对应的那个文件。就那题目给出的那个路径来解释,就是我们怎么$b到达$a呢,那首先从$b出发需要“../”上一级目录然后再“../”上一级目录来到了“/a/b”这个目录下,然后接着再从这个目录下出发,连接上“/c/d”然后就来到了$a所对应的目录。

也就是说,这个题目的主要任务是找到从$b到$a需要“上几级”才能到达和$a具有相同目录的地方,然后接着连接上$a接下来的那部分,那么我们就得到了答案,所以题目的关键是找到底需要“上几级”!

废话不多说,直接看代码:

 

/** * 计算$b相对于$a的相对路径 * @param string $a * @param string $b * @return string */function getRelativePath($a, $b) {	$relativePath = "";	$pathA = explode('/', dirname($a));	$pathB = explode('/', dirname($b));	$n = 0;	$len = count($pathB) > count($pathA) ? count($pathA) : count($pathB);	do {		if ( $n >= $len || $pathA[$n] != $pathB[$n] ) {			break;		}	} while (++$n);	$relativePath .= str_repeat('../', count($pathB) - $n);	$relativePath .= implode('/', array_splice($pathA, $n));	return $relativePath;}$res = getRelativePath($a, $b);var_dump($res);

经过测试呢,上面列举的情况都满足。

那这段程序需要解释的就是:

$len为什么需要求出$a和$b中路径最少的一个?

那是因为下面我们通过do{}while();循环来从0即起始路径开始向下一直对比$a和$b的路径,希望找到是从哪个路径开始导致$a和$b不一样了,也就是从找到了$a和$b路径总共相同的路径数是几个了。那在寻找的过程中,如果出现$a和$b的路径一直不相等那么$n会一直增加导致陷入死循环,所以还需要另外一个条件,就是我们需要让$n的最大值不能超过$a和$b中路径最短的一个,为什么呢?因为$n一旦大于了$len那说明有一个路径已经结束了,那直到结束也没有找到$a和$b不一样的那个部分,那说明其中最短路径的长度正好是他们路径相同的数目。(多数其它程序就范了这个错误),也就不需要继续找了,因为我们已经找到了。

找到了相同路径的个数之后,首先需要计算的是:从$b到$a到底需要几个“../”,那么计算方法就是用“count($pathB) - $n”,为什么呢?因为$n表示路径相同的数目,而“ count($pathB)”表示$b的路径数,那么相互一减就得到了不同的路径数目也就是需要的几个“../”,那么减完之后的结果一定是大于等0的值,所以没问题!

找到了从$b到$a需要几个“../”之后的任务就是将这几个“../”和$a中不同的路径部分拼接一下就可以了,也就是代码:$relativePath .= implode('/', array_splice($pathA, $n));

到此,结束!

转载地址:http://ffoii.baihongyu.com/

你可能感兴趣的文章
JavaScript:时间日期格式验证大全
查看>>
pinyin4j:拼音与汉字的转换实例
查看>>
XML工具代码:SAX从String字符串XML内获取指定节点或属性的值
查看>>
时间日期:获取两个日期相差几天
查看>>
责任链模式 Chain of Responsibility
查看>>
高并发与大数据解决方案概述
查看>>
解决SimpleDateFormat线程安全问题NumberFormatException: multiple points
查看>>
MySQL数据库存储引擎简介
查看>>
处理Maven本地仓库.lastUpdated文件
查看>>
Kafka | 请求是怎么被处理的?
查看>>
Java并发编程1-线程池
查看>>
CentOS7,玩转samba服务,基于身份验证的共享
查看>>
计算机网络-网络协议模型
查看>>
计算机网络-OSI各层概述
查看>>
Java--String/StringBuffer/StringBuilder区别
查看>>
mySQL--深入理解事务隔离级别
查看>>
分布式之redis复习精讲
查看>>
数据结构与算法7-栈
查看>>
线性数据结构学习笔记
查看>>
Java并发编程 | 一不小心就死锁了,怎么办?
查看>>