算出两个文件的相对路径

时间:2020-05-01
$a=’/a/b/c/d/e.php’
$b=’/a/b/12/34/c.php’
计算出 $b 相对于 $a 的相对路径应该是../../c/d

写个通用方法

$a = '/a/b/c/d/e.php';
$b = '/a/b/12/34/c.php';

/**
 * 计算a相对于b文件的路径
 * @param string $aFile
 * @param string $bFile
 * @return string
 */
function cal($aFile, $bFile)
{
    // 把文件路径分割成数组循环判断
    $aFileArr = explode('/', $aFile);
    $bFileArr = explode('/', $bFile);
    // 相同目录的层数,根据相同计算不同的上级目录数和需要进入的不同目录
    $aEqNum = 0;
    $aFileArrLen = count($aFileArr);
    $bFileArrLen = count($bFileArr);
    $minLen = $aFileArrLen < $bFileArrLen ? $aFileArrLen : $bFileArrLen;
    for ($i = 0; $i < $minLen - 1; $i++) {
        if ($aFileArr[$i] == $bFileArr[$i]) {
            $aEqNum++;
        }
    }
    // 找到相对于$bFile ../ 需要多少个
    $num = $aFileArrLen - $aEqNum - 1;
    // 找到相对于$bFile需要多少个目录
    $bNeqDir = [];
    for ($i = $aEqNum; $i < $bFileArrLen - 1; $i++) {
        $bNeqDir[] = $bFileArr[$i];
    }
    return str_repeat('../', $num) . implode('/', $bNeqDir);
}

$result = cal($b, $a);
var_dump($result);
string(9) "../../c/d"