Не могу никак придумать алгоритм вычисления относительного пути одного файла к другому
Пример 1:
1. 55/46/21/11/to.txt
2. 55/46/54/18/from.txt
должно получится: ../../21/11/to.txt
Пример 2:
1. 55/to.txt
2. 55/46/54/18/from.txt
должно получится: ../../../to.txt
Пример 3:
1. 55/46/21/11/to.txt
2. 55/from.txt
должно получится: 46/21/11/to.txt
Делаю на PHP
function preparePath($to_path, $from_path): string
{
$to_parts = explode('/', $to_path);
$to_file = array_pop($to_parts);
$from_parts = explode('/', $from_path);
$from_file = array_pop($from_parts);
$diff = count($from_parts) <= count($to_parts) ? array_diff($to_parts, $from_parts) : array_diff($from_parts, $to_parts);
$int = count($from_parts) <= count($to_parts) ? array_intersect($to_parts, $from_parts) : array_intersect($from_parts, $to_parts);
$int_str = count($from_parts) == count($to_parts) ? str_repeat('../', count($int)) : '';
$diff_str = count($from_parts) <= count($to_parts) ? implode('/', $diff) . '/' : str_repeat('../', count($diff));
return $int_str . $diff_str . $to_file;
}
Но это работает только для указанных выше примеров, нельзя использовать...
Есть простой такой вариант, но пути получаются избыточные
function preparePath($to_path, $from_path): string
{
$to_parts = explode('/', $to_path);
$to_file = array_pop($to_parts);
$from_parts = explode('/', $from_path);
$from_file = array_pop($from_parts);
$int_str = str_repeat('../', count($from_parts));
$diff_str = implode('/', $to_parts);
return $int_str . $diff_str . '/' . $to_file;
}
Может есть что-то уже готовое?