一道PHP面试题,求两个文件的相对路径

首先原题是这样子的:

写一个函数,计算出两个文件的相对路径,如 $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 ( $pathA[$n] != $pathB[$n] || $n >= $len ) {
			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));

到此,结束!

时间: 2024-10-27 11:51:03

一道PHP面试题,求两个文件的相对路径的相关文章

php 求两个文件的相对路径

网上看了一些这个题的一些解答方法,不过大多数就是对目前需求而定的,比如 $a = '/a/b/c/d/e.php'; $b = '/a/d/12/34/c.php'; getpath($a , $b ); public function getpath($a, $b) { $aarr = explode('/', $a); $barr = explode('/', $b); $count = count($barr) - 2; $pathinfo = ''; for($i = 1; $i <=

利用sort和uniq求两个文件的并集,交集和差集

利用sort和uniq求两个文件的并集,交集和差集 并集:cat file1.txt file2.txt | sort | uniq > file.txt 交集:cat file1.txt file2.txt | sort | uniq -d >file.txt 差集:求file1.txt相对于file2.txt的差集,可先求出两者的交集file3.txt,然后在file1.txt中除去file3.txt即可. cat file1.txt file2.txt | sort | uniq -d

php获取两个文件的相对路径

例如:文件A 的路径是 /home/web/lib/img/cache.php 文件B的路径是 /home/web/api/img/temp/show.php 那么,文件A相对于文件B的路径是 ../../lib/img/cache.php function getRelativePath($urla,$urlb){ /*******第一步:获取两个文件的相同路径并去掉*****/ //获取路径名 $a_dirname=dirname($urla);   //$a_dirname=/home/w

PHP两个文件的相对路径

1 /** 2 * relativePath 计算两个文件的相对路径 3 * @param file1 参作为考路径 4 * @param file2 相对于$file1的路径 5 */ 6 function relativePath($file1, $file2){ 7 $aArr = explode('/', $file1); //explode函数用于切分字符串,返回切分后的数组,此处用'/'切分字符串 8 $bArr = explode('/', $file2); 9 10 $aDiff

2014年去哪儿网笔试题--有两个文件context.txt和words.conf,请尝试将他们合并成为一段文字,并打印出来。

有两个文件context.txt和words.conf,请尝试将他们合并成为一段文字,并打印出来. 这两个文件内容如下: context.txt “并不是每个人都需要$(qunar)自己的粮食,$(flight.1)每个人都需要做自己穿的$(flight.2),我们说着别人发明的$(hotel),使用别人发明的数学......我们一直在$(tuan)别人的成果.使用人类的已有经验和知识$(travel.1)来进行,是一件$(travel.2)的事情” word.conf flight=也不是:衣

12.写一个函数,算出两个文件的相对路径

//计算出 c.php相对于e.php的相对路径应该是../../12/34 $a = '/a/b/c/d/e.php'; $b = '/a/b/12/34/c.php'; getpathinfo($a, $b); function getpathinfo( $a, $b ) { $a2array = explode('/', $a); $b2array = explode('/', $b); $pathinfo = ''; for( $i = 1; $i <= count($b2array)-

两个文件diff:交集差集并集

comm comm -12 <(sort 123|uniq) <(sort 234 | uniq) | wc -l [comm -12 表示取消第一列和第二列的输出,即只输出第三列] comm命令可以求两个文件的比较结果.默认输出三列,分别表示A-B,B-A 和 A交B. comm命令要求输入文件的内容必须是排序且唯一的 https://www.xuebuyuan.com/1273561.html grep 交集:grep -F -f file1 file2 B-A:grep -F -v -f

海量数据面试题整理1.给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是

海量数据面试题整理 1. 给定a.b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a.b文件共同的url? 方案1:可以估计每个文件安的大小为50G×64=320G,远远大于内存限制的4G.所以不可能将其完全加载到内存中处理.考虑采取分而治之的方法. s 遍历文件a,对每个url求取,然后根据所取得的值将url分别存储到1000个小文件(记为)中.这样每个小文件的大约为300M. s 遍历文件b,采取和a相同的方式将url分别存储到1000各小文件(记为).这样

Linux 两个文件求交集、并集、差集

一.交集 sort a.txt b.txt | uniq -d 二.并集 sort a.txt b.txt | uniq 三.差集 a.txt-b.txt: sort a.txt b.txt b.txt | uniq -u b.txt - a.txt: sort b.txt a.txt a.txt | uniq -u 四.相关的解释 使用sort可以将文件进行排序,可以使用sort后面的玲玲,例如 -n 按照数字格式排序,例如 -i 忽略大小写,例如使用-r 为逆序输出等 uniq为删除文件中重