计算两个目录的相对路径,网上有好多代码,发现好多是用array_diff_assoc这个函数,这样不对.

我来写一个简单的.
https://segmentfault.com/a/1190000021291646

<?php
/**
 * Created by PhpStorm.
 * User: 优美代码
 * Date: 2019/9/9
 * Time: 19:59
 */

function getPath($path1, $path2)
{
    //是否是真实的路径格式 这里省略判断了,

    //两个文件相同时候,直接返回错误
    if ($path1 == $path2) {
        return false;
    }

    $arr1 = explode('/', $path1);
    $arr2 = explode('/', $path2);

    $count1 = count($arr1);

    for ($i = 0; $i < $count1; $i++) {
        //因为根目录都是开始"/"开始的.比较到不一致时候终止,
        if ($arr1[$i] !== $arr2[$i]) {
            break;
        }
    }
    //需要回退的次数
    $back_num = $count1 - $i - 1;

    //回退到交叉点
    if ($back_num == 0) {
        $back_str = './';
    } else {
        $back_str = str_repeat('../', $back_num);
    }

    //删除第二个路径中,与第一个路径里相同的部分
    //也就是删掉交叉点和前面的东西
    array_splice($arr2, 0, $i);
    $path2 = implode('/', $arr2);

    //组合起来
    return $back_str . $path2;
}

$path1 = '/data/www/app/book/a/d/a.php';
$path2 = '/data/app/app/book/b.php';


$path1 = '/data/www/app1/shop/model/index.php';
$path2 = '/data/www/app1/user.php';

echo getPath($path1, $path2);


说说代码原理:

给出两个路径
a是 /data/www/app1/shop/model/index.php
b是 /data/www/app1/user/model/ok/user.php

两个路径啊a,b,想象成两条河流, 有一个共同的源头是根目录 /,还有一个分支点 app1

分析第一个路径,
找到分支点 app1,从分支点开始数目录层次深度是m,

这样用m个../拼起来,就返回到分支点app1,

第二个路径的交汇点之后的路径"user/model/ok/user.php"

组成了 ../../user/model/ok/user.php

这就是b相对于a的,相对路径了 (在a文件中 引入b文件,用到的)

来自:优美代码.
https://segmentfault.com/a/1190000021291646


hello899
1 声望1 粉丝