php计算文件的相对路径函数

islandma 2014-05-27 10:26:01
$a = '/c/e.php';
$b = '/12/34/c.php';
//  计算出 $b 相对于 $a 的相对路径应该是 ../../c/d将()添上
function getRelativePath($a, $b) {
$returnPath = array(dirname($b));
$arrA = explode('/', $a);
$arrB = explode('/', $returnPath[0]);
unset($arrA[0]);
unset($arrB[0]);
for ($n = 1, $len = count($arrB); $n < $len; $n++) {
if ($arrA[$n] != $arrB[$n]) {
break;
} else {
unset($arrA[$n]);
unset($arrB[$n]);
}
}
$returnPath = array_merge(array_fill(1,count($arrB),'..'),$arrA);
return implode('/', $returnPath);
}
echo getRelativePath($a, $b);
...全文
495 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
islandma 2016-12-17
  • 打赏
  • 举报
回复
学习了
xuzuning 2014-05-28
  • 打赏
  • 举报
回复
function getRelativePath($a, $b) {
  $c['\\'] = '/'; 
  $a = explode('/', trim(strtr($a, $c), '/'));
  $b = explode('/', trim(strtr($b, $c), '/'));
  $t = 0;
  foreach($a as $k=>$v) {
    if($b[$k] == $v) $t++;
    else break;
  }
  $r = array_merge(array_fill(0, count($b) - $t, '..'), array_slice($a, $t));
  return join('/', $r);
}

$a = '/home/web/lib/img/cache.php';
$b = '/home/web/api/img/show.php';

echo getRelativePath($a, $b);
xuzuning 2014-05-28
  • 打赏
  • 举报
回复
嗯,下标不连续
傲雪星枫 2014-05-28
  • 打赏
  • 举报
回复
改了一下

/** 计算path1 相对于 path2 的路径,即在path2引用paht1的相对路径 
* @param  String $path1 
* @param  String $path2 
* @return String 
*/  
function getRelativePath($path1, $path2){  
    $arr1 = explode('/', $path1);  
    $arr2 = explode('/', $path2);  
  
    // 获取相同路径的部分  
    $intersection = array_intersect_assoc($arr1, $arr2);  
  
    $depth = 0;  
  
    for($i=0,$len=count($intersection); $i<$len; $i++){  
        if(!isset($intersection[$i])){  
            $depth = $i;  
            break;  
        }  
    }  
  
    // 将path2的/ 转为 ../,path1获取后面的部分,然后合拼  
    $tmp = array_merge(array_fill(0, count($arr2)-$depth-1, '..'), array_slice($arr1, $depth));  
  
    $relativePath = implode('/', $tmp);  
  
    return $relativePath;  
} 
傲雪星枫 2014-05-28
  • 打赏
  • 举报
回复
引用 2 楼 xuzuning 的回复:
这样可能好些
$a = '/c/e.php';
$b = '/12/34/c.php';
//  计算出 $b 相对于 $a 的相对路径应该是 ../../c/e.php
function getRelativePath($a, $b) {
  $c['\\'] = '/'; 
  $a = explode('/', trim(strtr($a, $c), '/'));
  $b = explode('/', trim(strtr($b, $c), '/'));
  $t = array_intersect_assoc($a, $b);
  $r = array_merge(array_fill(0, count($b) - count($t) - 1, '..'), array_slice($a, count($t)));
  return join('/', $r);
}
echo getRelativePath($a, $b);
$a = '/home/web/lib/img/cache.php'; $b = '/home/web/api/img/show.php'; 这样就不行了。
xuzuning 2014-05-27
  • 打赏
  • 举报
回复
这样可能好些
$a = '/c/e.php';
$b = '/12/34/c.php';
//  计算出 $b 相对于 $a 的相对路径应该是 ../../c/e.php
function getRelativePath($a, $b) {
  $c['\\'] = '/'; 
  $a = explode('/', trim(strtr($a, $c), '/'));
  $b = explode('/', trim(strtr($b, $c), '/'));
  $t = array_intersect_assoc($a, $b);
  $r = array_merge(array_fill(0, count($b) - count($t) - 1, '..'), array_slice($a, count($t)));
  return join('/', $r);
}
echo getRelativePath($a, $b);
xuzuning 2014-05-27
  • 打赏
  • 举报
回复
a = 'c/e.php'; $b = '/12/34/c.php'; echo getRelativePath($a, $b); // ../../e.php

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧