问题:写一个函数,算出两个文件的相对路径
如 $a = ‘/a/b/c/d/e/f.php’;
$b = ‘/a/b/12/34/c.php’;
计算出$b相对于$a的相对路径是../../../12/34
最初看到这个问题的时候,立马就想起了yii框架中的实现。yii生成网站的时候,就用到了相对路径的逻辑。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
/** * Returns variant of $path1 relative to $path2 * * @param string $path1 * @param string $path2 * @return string $path1 relative to $path2 */ protected function getRelativePath($path1,$path2) { $segs1=explode(DIRECTORY_SEPARATOR,$path1); $segs2=explode(DIRECTORY_SEPARATOR,$path2); $n1=count($segs1); $n2=count($segs2); for($i=0;$i<$n1 && $i<$n2;++$i) { if($segs1[$i]!==$segs2[$i]) break; } if($i===0) return "'".$path1."'"; $up=''; for($j=$i;$j<$n2-1;++$j) $up.='/..'; for(;$i<$n1-1;++$i) $up.='/'.$segs1[$i]; return 'dirname(__FILE__).\''.$up.'/'.basename($path1).'\''; } } |
$a 路由到 $b,最先的操作应该是../ 或者 ./。从根目录开始,相同的父路径在计算相对路径的时候,是没有任何影响的。上面的问题可以转化成求:
$a1 = ‘/c/d/e/f.php’;
$b1 = ‘/12/34/c.php’;
这两者的相对路径。这样,就清晰多了。
实现方法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
function getRelativePath($path1, $path2) { $n1 = explode('/', $path1); $n2 = explode('/', $path2); foreach ($n1 as $key => $val) { if ($val == $n2[$key]) { unset($n1[$key]); unset($n2[$key]); } else { break; } } // 重新索引 $n1 = array_values($n1); $n2 = array_values($n2); $up = ''; for ($i = 0; $i < count($n1) -1 ; $i++) { $up .= '../'; } if (!$up) { $up = './'; } for ( $j = 0; $j < count($n2) -1; $j++) { $up .= $n2[$j] . '/'; } return $up . $n2[count($n2) - 1] ; } |