1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
<?php
$a
=
'/a/b/c/d/e.php'
;
$b
=
'/a/b/12/34/c.php'
;
function
getRelativePath(
$a
,
$b
) {
$returnPath
=
array
(dirname(
$b
));
print_r(
$returnPath
);
//Array ( [0] => /a/b/12/34 )
$arrA
=
explode
(
'/'
,
$a
);
print_r(
$arrA
);
//Array ( [0] => [1] => a [2] => b [3] => c [4] => d [5] => e.php )
$arrB
=
explode
(
'/'
,
$returnPath
[0]);
print_r(
$arrB
);
//Array ( [0] => [1] => a [2] => b [3] => 12 [4] => 34 )
for
(
$n
= 1,
$len
=
count
(
$arrB
);
$n
<
$len
;
$n
++) {
if
(
$arrA
[
$n
] !=
$arrB
[
$n
]) {
break
;
}
}
echo
$n
,
$len
;
//$n=3,$len=5
if
(
$len
-
$n
> 0) {
//
$returnPath
=
array_merge
(
$returnPath
,
array_fill
(1,
$len
-
$n
,
'..'
));
}
print_r(
$returnPath
);
//Array ( [0] => /a/b/12/34 [1] => .. [2] => .. )
$returnPath
=
array_merge
(
$returnPath
,
array_slice
(
$arrA
,
$n
));
print_r(
$returnPath
);
//Array ( [0] => /a/b/12/34 [1] => .. [2] => .. [3] => c [4] => d [5] => e.php )
return
implode(
'/'
,
$returnPath
);
}
echo
getRelativePath(
$a
,
$b
);
?>
|
第一步:找出 $a和$b同属的目录路径 "/a/b/ " , $b="/a/b/12/34/c.php" 和 "/a/b/" 路径深度相差为2,所以 $b="/a/b/12/34/c.php" 需要 "../../" (array_fill(1, $len - $n, '..'))才能返回到 "/a/b/"。
第二步:找出 $a=/a/b/c/d/e.php 去掉 "/a/b/"而剩余的部分 "c/d/e.php" (array_slice($arrA, $n))。
最后:"../../" 和 "c/d" 拼接得到 "../../c/d"