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