• 相对路径的计算问题


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

  • 相关阅读:
    在CSS里加下面任何一行代码都可以解决图片之间的间隙
    MasterPage Toolbar
    图解虚拟机VMware服务自动启动
    WSUS完全部署
    DIV全屏覆盖网页
    大型架构.net平台篇(WEB层均衡负载nginx)
    组策略设置及导出导入方法[附上设置好的组策略]
    如何設定定時關機?
    gridview获取当前行索引的方法
    no suject
  • 原文地址:https://www.cnblogs.com/jasonyou/p/13622559.html
Copyright © 2020-2023  润新知