zoukankan      html  css  js  c++  java
  • 相对路径的计算问题

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

  • 相关阅读:
    利用iframe实现ajax 跨域通信的解决方案
    C++中事件机制的简洁实现
    java远程类加载与轻客户端
    iOS开发那些事性能优化–内存泄露问题的解决
    Asp.net项目的开发流程
    LVS配置教程
    PowerShell之东扯西谈
    响应式设计专题
    2013年最值得关注的网页设计流行趋势
    HTTP Live Streaming直播技术分析与实现
  • 原文地址:https://www.cnblogs.com/jasonyou/p/13622559.html
Copyright © 2011-2022 走看看