在同一个根目录下有两个目录
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);