PHP計算相対パス


PHPで相対パスを計算するコード
function transfer($apa, $apb, &$rpa, &$rpb)
{
	$apa = str_replace('\\', '/', $apa); //  \    /
	$apb = str_replace('\\', '/', $apb);
	//                 /  \
	if($apa == '' || $apb == '' || $apa == '/' || 
		$apb == '/' || $apa == '\\' || $apb == '\\') 
		return false;
	$apa_arr = explode('/', trim($apa, '/'));
	$apb_arr = explode('/', trim($apb, '/'));
	$al = count($apa_arr);
	$bl = count($apb_arr);
	$i=0;
	while(true)
	{
		if($i>=$al || $i>=$bl)
		{
			break;
		}
		if($apa_arr[$i] != $apb_arr[$i])
		{
			break;	
		}
		$i++;
	}
	$rpa = '';
	$rpb = '';
	for($j=$i; $j

サンプルを使用してテスト:
それぞれ:
1、2つのパスのうちの1つが空白です
2、2つのパスが異なるディレクトリの下にある
3、2つのパスが同じディレクトリの下にある
4.1つのパスの親パスと別のパスが同じディレクトリの下にある
試験手順:
";

function transfer($apa, $apb, &$rpa, &$rpb)
{
	$apa = str_replace('\\', '/', $apa); //  \    /
	$apb = str_replace('\\', '/', $apb);
	//                 /  \
	if($apa == '' || $apb == '' || $apa == '/' || 
		$apb == '/' || $apa == '\\' || $apb == '\\') 
		return false;
	$apa_arr = explode('/', trim($apa, '/'));
	$apb_arr = explode('/', trim($apb, '/'));
	$al = count($apa_arr);
	$bl = count($apb_arr);
	$i=0;
	while(true)
	{
		if($i>=$al || $i>=$bl)
		{
			break;
		}
		if($apa_arr[$i] != $apb_arr[$i])
		{
			break;	
		}
		$i++;
	}
	$rpa = '';
	$rpb = '';
	for($j=$i; $j b:$apb
"; if(transfer($apa, $apb, $a, $b)) echo 'a b :'.$a.'
b a :'.$b.'
'; else echo ' '; echo '

'; } output('/home/web/test/a.php',''); output('/home/web/test/a.php','/home/data/d.png'); output('/home/web/test/a.php','/home/web/test/d.png'); output('/home/web/test/myyy/a.php','/home/web/test/d.png'); ?>

結果:
     to     :
 a:/home/web/test/a.php
 b:
       

 a:/home/web/test/a.php
 b:/home/data/d.png
a   b   :../web/test/a.php
b   a   :../../data/d.png


 a:/home/web/test/a.php
 b:/home/web/test/d.png
a   b   :a.php
b   a   :d.png


 a:/home/web/test/myyy/a.php
 b:/home/web/test/d.png
a   b   :myyy/a.php
b   a   :../d.png