相对路径的计算问题

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

  参考 : https://my.oschina.net/u/1156660/blog/341508

posted @ 2020-09-06 18:01  brave_jman  阅读(220)  评论(0编辑  收藏  举报