$from = '/home/ftp123/aa.txt';
$to = '/home/samba/bb.txt';
function relativePath($from, $to, $ps = DIRECTORY_SEPARATOR)
{
$arFrom = explode($ps, rtrim($from, $ps));//去除字符串最后的分隔符
$arTo = explode($ps, rtrim($to, $ps));//去除字符串最后的分隔符
while(count($arFrom) && count($arTo) && ($arFrom[0] == $arTo[0]))
{
array_shift($arFrom);
array_shift($arTo);
}
//这里是str_pad的妙用
return str_pad("", count($arFrom) * 3, '..'.$ps).implode($ps, $arTo);
}
echo relativePath($from,$to,'/');
上面是自己写的计算两个相对路径的函数,可能步骤有点多,但是这个也是一种思路,如果你有更好的,请贴上代码,还有就是说这个代码一次性调试成功,很高兴自己在提高
,而不是写好了立马就测试,先检查代码,而不是去靠报错来解决问题,你赞同吗?
今天在看Php手册的时候又发现了一种方法,这种方法非常简洁,多么奇妙写法
<?php
$b = '/a/b/c/d/f/g/e.php';
$a = '/a/b/12/34/c.php';
//实现思路
//1.将两个路径从顶端比对
//2.退还到相同的父目录
function get_relative_path($a,$b)
{
$a = str_replace('\\', '/', $a);
$b = str_replace('\\','/',$b);
$arra = explode('/', $a);
$arrb = explode('/', $b);
//寻找相同目录
for($i=0,$j=count($arra)-1;$i<$j;$i++)
{
if($arra[$i] == $arrb[$i])
{
unset($arra[$i]);
unset($arrb[$i]);
}
else
{
$arra[$i] = '..';
}
}
array_pop($arra);//将e.php这个弹出栈
$stra = implode('/',$arra); //../../
$strb = implode('/',$arrb);//12/34/c.php
return $stra.'/'.$strb;
}
echo get_relative_path($a,$b);
?>
<?php$b = '/a/b/c/d/f/g/e.php';$a = '/a/b/12/34/c.php';//实现思路//1.将两个路径从顶端比对//2.退还到相同的父目录function get_relative_path($a,$b){$a = str_replace('\\', '/', $a);$b = str_replace('\\','/',$b);$arra = explode('/', $a);$arrb = explode('/', $b);//寻找相同目录for($i=0,$j=count($arra)-1;$i<$j;$i++){if($arra[$i] == $arrb[$i]){unset($arra[$i]);unset($arrb[$i]);}else{$arra[$i] = '..';}}array_pop($arra);//将e.php这个弹出栈$stra = implode('/',$arra); //../../$strb = implode('/',$arrb);//12/34/c.phpreturn $stra.'/'.$strb;}echo get_relative_path($a,$b);?>