- var_dump: documentation ( source)
- basename: documentation ( source)
- dirname: documentation ( source)
- array_reduce: documentation ( source)
- array_unshift: documentation ( source)
- array_shift: documentation ( source)
<?php
function concat_path_components($path_components)
{
$first_component = array_shift($path_components);
if ($first_component == NULL)
return "";
return array_reduce(
$path_components,
function ($path, $path_component)
{
return $path . DIRECTORY_SEPARATOR . $path_component;
},
$first_component);
}
function path_components($path)
{
$components = array();
while ($path != "." && $path != "/")
{
array_unshift($components, basename($path));
$path = dirname($path);
}
if ($path == "/")
array_unshift($components, "/");
return $components;
}
function path_relative_to($path, $rel)
{
$path_components = path_components($path);
$copy = $path_components;
$rel_components = path_components($rel);
for($i = 0 ; $i < count($rel_components) ; ++$i)
{
if ($path_components[$i] == $rel[$i])
array_shift($copy);
else
break;
}
if ($i == count($rel_components) -1)
return concat_path_components($copy);
else
return "";
}
var_dump(path_relative_to("/a/b/c", "/a/bc"));