PHP-PHP 如何算出两个文件的相对路径

PHP-PHP 如何算出两个文件的相对路径

灵芸 发布于 2017-03-01 字数 144 浏览 1254 回复 12

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

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

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(12

灵芸 2017-11-06 12 楼

$a = '/a/b/c/d/e.php';
$b = '/a/b/12/34/c.php';
echo getRelativelyPath($a,$b);
//求$b相对于$a的相对路径
function getRelativelyPath($a,$b){
//拆分成数组
$a = explode('/',$a);
$b = explode('/',$b);
$path = '';
//将两个数组的索引重置
$c = array_values(array_diff($a,$b));
$d = array_values(array_diff($b,$a));
//去除掉a路径的文件名
array_pop($c);
//将a路径中的目录名替换为..
foreach($c as &$v) $v = '..';

//合并两个数组
$e = array_merge($c,$d);
//拼接路径
foreach($e as &$v)

$path .= $v.'/';
return rtrim($path,'/');
}

偏爱自由 2017-10-05 11 楼

/*
$a为路径1,
$b为路径2,
$c为路径1的搜索位置,
$d为路径2的搜索位置,
*/
function abc($a,$b,$c,$d){
if(empty($a) || empty($b) || !is_numeric($c) || !is_numeric($d)){
return $b;
}
$tmp1=strpos($a,'/',$c+1);
$tmp2=strpos($b,'/',$d+1);
$tmp3=substr($a,$c+1,$tmp1-$c-1);
$tmp4=substr($b,$d+1,$tmp2-$d-1);
if($tmp1!==false&&$tmp2!==false){
if($tmp3===$tmp4){
if($d==0){
$b='..'.substr($b,$tmp2);
}else{
$b=substr($b,0,$d+1).'..'.substr($b,$tmp2);
$tmp2=$tmp2+(2-strlen($tmp4));
}
$b=abc($a,$b,$tmp1,$tmp2);

}
}
return $b;
}

晚风撩人 2017-09-20 10 楼

 function pathconvert($cur,$absp)//当前文件,目标路径
{
$cur = str_replace('\','/',$cur);
$absp = str_replace('\','/',$absp);
$sabsp=explode('/',$absp);
$scur=explode('/',$cur);
$la=count($sabsp)-1;
$lc=count($scur)-1;
$l=max($la,$lb);

for ($i=0;$i<=$l;$i++)
{
if ($sabsp[$i]!=$scur[$i])
break;
}
$k=$i-1;
$path="";
for ($i=1;$i<=($lc-$k-1);$i++)
$path.="../";
for ($i=$k+1;$i<=($la-1);$i++)
$path.=$sabsp[$i]."/";
$path.=$sabsp[$la];
return $path;
}
//测试代码
$path=pathconvert("/a/b/c/d/e.php","/a/b/12/34/c.php");
echo $path;//输出../../12/34/c.php

灵芸 2017-08-26 9 楼

 function getpathinfo( $a, $b )
{
$a2array = explode('/', $a);
$b2array = explode('/', $b);
$pathinfo = '';
for( $i = 1; $i <= count($b2array)-2; $i++ )
{
$pathinfo.=$a2array[$i] == $b2array[$i] ? '../' : $b2array[$i].'/';
}
return $pathinfo;
}

灵芸 2017-08-01 7 楼

针对你的问题,我也自己写了一个方法

 function test($a, $b){
$str = '';
$a = explode('/', ltrim($a, '/'));
$b = explode('/', ltrim($b, '/'));

$intersect = array_intersect_assoc($a, $b);
if($intersect){
$j = -1;
$num = 0;
foreach ($intersect as $k => $v){
if($k-1 != $j) {
break;
}else{
$str .= '../';
}
$j = $k;
$num++;
}
$ret = array_slice($a, $num);
return $str . implode('/', $ret);
}
}

$a = '/a/b/c/d/e/f/f.jpg';
$b = '/a/b/q/q/q/q/f.jpg';
echo test($a, $b);

归属感 2017-07-27 6 楼

 function getRelativePath($a, $b) {
$returnPath = array(dirname($b));
$arrA = explode('/', $a);
$arrB = explode('/', $returnPath[0]);
for ($n = 1, $len = count($arrB); $n < $len; $n++){
if ($arrA[$n] != $arrB[$n]) {
break;
}
}
if ($len - $n > 0) {
$returnPath =array_merge($returnPath, array_fill(1, $len - $n, '..'));
}

$returnPath = array_merge($returnPath,array_slice($arrA, $n));
return implode('/', $returnPath);
}

$a ='/a/b/c/d/e.php';
$b = '/a/b/12/34/c.php';
echo getRelativePath($a, $b);

清晨说ぺ晚安 2017-07-06 5 楼

 function getRelativePath($a,$b){
$a_url = array(dirname($a));
$b_url = array(dirname($b));
$a_arr = explode('/',$a_url[0]);
$b_arr = explode('/',$b_url[0]);
$len = count($a_arr);
$art1 = '';
$art2 = '';
for($i=1;$i<$len;$i++){
if($a_arr[$i]<>$b_arr[$i]){
$art1.= '../';
$art2.= $a_arr[$i].'/';
}
}
return $art1.$art2;
}

清晨说ぺ晚安 2017-06-25 4 楼

楼上各位大侠都是通过数组来实现,我这里用字符串实现了一个,我想效率方面应该会比数组更高一些吧,而且更精简一些。

 function relativePath($a, $b){
$str = '';
for($i=$pos=0; $i<=strlen($a); $i++){
if(substr($a, 0, $i) != substr($b, 0, $i)){
break;
}else if($a{$i} == '/' && $b{$i} == '/' && $i !=0){
$str .= '../';
$pos = $i;
}
}
return empty($str) ? $a : $str . substr($a, $pos+1);
}
//调试
$a = '/a/bf/q/d/e/f/f.jpg';
$b = '/a/bf/q/r/q/q/f.jpg';
echo relativePath($a, $b); //输出 ../../../d/e/f/f.jpg

虐人心 2017-03-27 3 楼

应该很多这样的算法,我也来一个

 <?php
function comparePath($path_a, $path_b) {
//切割路径.
$array_a =explode('/', $path_a);
$array_b =explode('/', $path_b);
//从数组中删除最后的文件,剩下的全为文件夹名称.
$file_a =array_pop($array_a);
$file_b =array_pop($array_b);
//子目录个数.
$a_len =count($array_a);
$b_len =count($array_b);
//循环求出第几个目录不同.
for ( $i =0; $i < $a_len; $i++ ) {
if ($array_a[$i] != $array_b[$i] ) {
break;
}
}
//求出相对路径.
$com_path ="";
for ( $j =0; $j < $a_len - $i; $j++ ) {
$com_path .='../';
}
for ( $i; $i< $b_len; $i++ ) {
$com_path .=$array_b[$i] . '/';
}
$com_path .=$file_b;
echo $com_path;
}
$path_a ='/a/b/c/d/e.php';
$path_b = '/a/b/12/34/c.php';
comparePath($path_a, $path_b);
?>

甜柠檬 2017-03-17 2 楼

一个简单、清晰、明了的:

function getRelationPath($a1, $b1) {
$a1 = explode('/', ltrim($a1, '/'));
$b1 = explode('/', ltrim($b1, '/'));
for($i = 0; isset($b1[$i], $a1[$i]); $i++){
if($a1[$i] == $b1[$i]) $a1[$i] = "..";
else break;
}
return implode("/", $a1);
}
echo getRelationPath($a, $b);

结果是:
../../c/d/e.php

灵芸 2017-03-11 1 楼

这是我以前自己写的,可能没有上面各位大侠的好,不过你可以对比一下的:

 <?php
$a = '/a/b/c/d/e.php';   
$b ='/a/b/12/34/c.php';
$path1 = explode('/',dirname($a));
$path2 = explode('/',dirname($b));
$aLen = count($path1);
$bLen = count($path2);
$maxLen = max($aLen,$bLen);
for($i = 1; $i < $maxLen; $i++){
if($path1[$i] != $path2[$i] && isset($path1[$i])){
if(isset($path2[$i]))$bUrl[]=$path2[$i];
$path .= "../";
}else{
$bUrl[]=$path2[$i];
}
}
echo $path.implode('/',$bUrl).'/'.basename($b);
?>