You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
40 lines
1.3 KiB
40 lines
1.3 KiB
5 years ago
|
<?php
|
||
|
|
||
|
namespace yii\helpers;
|
||
|
|
||
|
class FileHelper extends BaseFileHelper
|
||
|
{
|
||
|
public static 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);
|
||
|
}
|
||
|
}
|