欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PHP 写一个函数,算出两个文件的相对路径?

程序员文章站 2022-05-09 22:55:21
...

$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

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

相关标签: PHP