Skip to content

Instantly share code, notes, and snippets.

@designermonkey
Created January 1, 2019 23:30
Show Gist options
  • Save designermonkey/2e4633a58bf6fb285b87912113a3c80d to your computer and use it in GitHub Desktop.
Save designermonkey/2e4633a58bf6fb285b87912113a3c80d to your computer and use it in GitHub Desktop.
<?php
if (!function_exists('relative_path')) {
function relative_path(string $from, string $to): string {
// 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);
continue;
}
// 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;
}
$relPath[0] = './' . $relPath[0];
}
return implode('/', $relPath);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment