PHP 算出两个文件的相对路径?

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

function getRelativePath($file1,$file2){
    //分别对两个文件路径进行分割
    $file1_arr = explode('/', $file1);
    $file2_arr = explode('/', $file2);
  
    //计算file1文件不同于file2的部分(计算差集)
    $arr1 = array_diff_assoc($file1_arr,$file2_arr);
    var_dump($arr1);
    $arr2 = array_diff_assoc($file2_arr,$file1_arr);
  	var_dump($arr2);

    $arr1_cnt = count($arr1);
    var_dump($arr1_cnt);
    $str_path = '';
    for($i=0;$i<$arr1_cnt-1;$i++){
        $str_path .='../';
        var_dump($str_path);
    }
    $path2 = implode('/',$arr2);
    var_dump($path2);
    return $str_path . $path2;
}
    echo getRelativePath($a,$b);  //     输出  ../../12/34/c.php

E:\xampp\htdocs\xampp\cba.php:139:
array (size=3)
  3 => string 'c' (length=1)
  4 => string 'd' (length=1)
  5 => string 'e.php' (length=5)
E:\xampp\htdocs\xampp\cba.php:141:
array (size=3)
  3 => string '12' (length=2)
  4 => string '34' (length=2)
  5 => string 'c.php' (length=5)
E:\xampp\htdocs\xampp\cba.php:144:int 3
E:\xampp\htdocs\xampp\cba.php:148:string '../' (length=3)
E:\xampp\htdocs\xampp\cba.php:148:string '../../' (length=6)
E:\xampp\htdocs\xampp\cba.php:151:string '12/34/c.php' (length=11)
../../12/34/c.php

思想:将 a 和 a和 ab按照/分割成数组后,从前往后进行比较,与到第一个不同目录后,后面所有的目录都应该视为不同。如"/a/b/c/d/e.php"和"/a/b/12/d/c.php",由于c和12不同,此时前者d和后者d也应该视为不同目录。为此,在找到第一个不同目录后,将标识 f l a g 设 置 为 0 。 在 遍 历 flag设置为0。在遍历 flag0b时,找到第一个不同目录后,后面所有目录都应该加上…/;然后在连接上$a中第一个不同目录后所有值。

$a = ‘/a/b/c/d/f/g/h/e.php’;
$b = ‘/a/b/1/2/c.php’;

echo "<br/>";
echo getRelativePath($a, $b);  
echo "<br/>";
function getRelativePath($a , $b){
      $a_list = explode("/", $a);
      $b_list = explode("/", $b);
      $a_count = count($a_list);
      $num = 0;//用于计数,将$a_list从$num开始的元素复制出来
      $path = "";
      $flag = 1;//设置标识,当出现第一个不想同目录后,后面所有的目录都应该视为不同的
      for($i = 0 ; $i < count($b_list)-1; $i++)
      {
         if($flag == 1)
            if( $i < $a_count-1 && $b_list[$i] == $a_list[$i] )
            {
               $num++;
               continue;
            }else {
               $path .="../";
               $flag =0;
            }
         else
            $path .= "../";
      }
      $path .=  implode("/", array_slice($a_list, $num)) ;
      return $path;
   }
../../c/d/e.php

参考
https://blog.csdn.net/zuimei_forver/article/details/50484933

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伟伟哦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值