PHP-获取从一个目录到另一个目录的相对路径



假设我有以下两个目录路径:

"/www/website/news/old/">

"/www/library/js/">

我需要一个PHP函数来输出从一个目录到另一个目录的相对路径。在这个例子中,它应该输出类似于"../..//library/js/">

以下函数可以完成任务:

function getRelativePath($source, $destination) {
$sourceArray = [];
preg_match_all('/([^/]+)/', $source, $sourceArray);
$destinationArray = [];
preg_match_all('/([^/]+)/', $destination, $destinationArray);

$sourceArray = array_reverse($sourceArray[0]);
$destinationArray = array_reverse($destinationArray[0]);

$relative = [];
$hasPath = false;
foreach ($sourceArray as $path) {
for ($i = 0; $i < count($destinationArray); $i++ ) {
$to = $destinationArray[$i];
if ($path == $to) {
$hasPath = true;
for ($j = $i - 1; $j >= 0 ; $j--)
$relative[] = $destinationArray[$j];
break 2;    
}
}
$relative[] = "..";
}
return $hasPath ? implode("/",$relative) . "/" : "NO PATH";
}

Amir MB的解决方案在某些方面似乎存在缺陷。

假设我们在整个路径中有重复的文件夹名称。

/var/www/src/vendor/package/public
/var/www/vendor/src/index.php

您的解决方案返回:

../../src/index.php/

也就是说,当它偶然发现一个重复的(存在于两条路径中的(文件夹名称时,提升就会中断。

正确答案必须是:

../../../../vendor/src/index.php

在中

/var/www/src/vendor_1/Package_1/public
/var/www/vendor/src/index.php
Flawed: ../../../index.php/
Correct: ../../../../vendor/src/index.php

当两条路径都是相对的时,会发生类似的事情:

src/vendor_1/Package_1/public
vendor/src/index.php
Flawed: ../../../index.php/
Correct: ../../../../vendor/src/index.php

我遇到了其他解决方案失败的案例。算法必须改变。

以下是一个简单的函数,给定源和目标EXIST:

function getRelativePath($source, $destination)
{
$paths =
array_map(fn ($arg) => explode('/', realpath($arg)), func_get_args());
return
str_repeat('../', count(array_diff_assoc(...$paths))) .
implode('/', array_diff_assoc(...array_reverse($paths)));
}

没什么新奇的。没有对源是文件夹而不是文件进行检查(注意,目标可以是文件,而源应该是计算相对路径的目录。

我可能很快就会回来,为任何路径提供一个通用的解决方案,无论是否存在,无论是相对的还是绝对的。

相关内容

  • 没有找到相关文章

最新更新