Я заметил некоторые подобные вопросы об этой проблеме, когда я ввел заголовок, но они кажутся не быть в PHP. Таким образом, что решение к нему с функцией PHP?
Быть указанным.
$a="/home/apache/a/a.php";
$b="/home/root/b/b.php";
$relpath = getRelativePath($a,$b); //needed function,should return '../../root/b/b.php'
Какие-либо хорошие идеи?Спасибо.
Попробуйте это:
function getRelativePath($from, $to)
{
// some compatibility fixes for Windows paths
$from = is_dir($from) ? rtrim($from, '\/') . '/' : $from;
$to = is_dir($to) ? rtrim($to, '\/') . '/' : $to;
$from = str_replace('\\', '/', $from);
$to = str_replace('\\', '/', $to);
$from = explode('/', $from);
$to = explode('/', $to);
$relPath = $to;
foreach($from as $depth => $dir) {
// find first non-matching dir
if($dir === $to[$depth]) {
// ignore this directory
array_shift($relPath);
} else {
// get number of remaining dirs to $from
$remaining = count($from) - $depth;
if($remaining > 1) {
// add traversals up to first matching dir
$padLength = (count($relPath) + $remaining - 1) * -1;
$relPath = array_pad($relPath, $padLength, '..');
break;
} else {
$relPath[0] = './' . $relPath[0];
}
}
}
return implode('/', $relPath);
}
Это даст
$a="/home/a.php";
$b="/home/root/b/b.php";
echo getRelativePath($a,$b), PHP_EOL; // ./root/b/b.php
и
$a="/home/apache/a/a.php";
$b="/home/root/b/b.php";
echo getRelativePath($a,$b), PHP_EOL; // ../../root/b/b.php
и
$a="/home/root/a/a.php";
$b="/home/apache/htdocs/b/en/b.php";
echo getRelativePath($a,$b), PHP_EOL; // ../../apache/htdocs/b/en/b.php
и
$a="/home/apache/htdocs/b/en/b.php";
$b="/home/root/a/a.php";
echo getRelativePath($a,$b), PHP_EOL; // ../../../../root/a/a.php
Относительный путь? Это больше похоже на путь путешествия. Похоже, вы хотите знать путь, по которому идет от пути A к пути B. Если это так, вы можете взорвать $ a и $ b на '/'
, а затем наоборот цикл через $ aParts, сравнивая их с $ bParts того же индекса, пока не будет найден каталог «общего знаменателя» (записывая количество циклов на этом пути). Затем создайте пустую строку и добавьте к ней '../'
раз $ numLoops-1, затем добавьте к этому $ b минус каталог общего знаменателя.
Основываясь на функции Гордона, мое решение следующее:
function getRelativePath($from, $to)
{
$from = explode('/', $from);
$to = explode('/', $to);
foreach($from as $depth => $dir)
{
if(isset($to[$depth]))
{
if($dir === $to[$depth])
{
unset($to[$depth]);
unset($from[$depth]);
}
else
{
break;
}
}
}
//$rawresult = implode('/', $to);
for($i=0;$i<count($from)-1;$i++)
{
array_unshift($to,'..');
}
$result = implode('/', $to);
return $result;
}