相对路径的计算问题
在同一个根目录下有两个目录
a的路径为 '/a/b/c/d/e.php';
b的路径为 '/a/b/12/34/c.php';
a相对于b的路径为 ../../12/34
b相对于a的路径为 ../../c/d
相对于谁就是以谁就是基准点,参照物, 通过基准点 找到另一个的路径
<?php
$a='/a/b/c/d/e.php';
$b='/a/b/12/34/c.php';
/**
* 相对路径计算
*
* @param [type] $a 基准点,参照物
* @param [type] $b
* @return void
*/
function relative($a, $b) {
$na=explode('/',$a);
$nb=explode('/',$b);
$numa=count($na);
$numb=count($nb);
$max=$numa>$numb?$numa:$numb;
$up = $path = '';
for($i=0;$i<$max-1;$i++){
if($na[$i]!=$nb[$i]){
$up.='../';
$path.=$na[$i]."/";
}}
$relpath=$up.$path;
echo trim($relpath,'/').PHP_EOL;
}
relative($a, $b);
relative($b, $a);
以上代码存在错误,下面为改进版
<?php
// A相对于B的路径,是在 A里面找到B;还是在B里面找到A,这个首先要确定
// 这里按照B里面找到A的原则进行计算
$a = '/a/b/c/d/a.php';
$b='/a/b/1/2/b.php';
/**
* 计算$a相对于$b的相对路径
* @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);
// 最大的相同路径有多少个
for ($n=0; $n < $len; $n++) {
if ( $pathA[$n] != $pathB[$n]) break;
}
// 计算B需要返回几层可以到达相同路径
$relativePath .= str_repeat('../', count($pathB) - $n);
// 计算A去掉相同路径后的地址
$relativePath .= implode('/', array_splice($pathA, $n));
// 返回A相对于B的路径地址
return $relativePath;
}
$res = getRelativePath($a, $b);
// $res = getRelativePath($b, $a);
var_dump($res);

浙公网安备 33010602011771号