--- layout: default title: The Hierarchical Path component redirect_from: - /5.0/components/hierarchical-path/ --- # The Hierarchical Path component The library provides a `HierarchicalPath` class to ease HTTP like path creation and manipulation. This URI component object exposes : - the [package common API](/components/1.0/api/) - the [path common API](/components/1.0/path) but also provide specific methods to work with segments-type URI path components.
## Instantiation using the constructor ~~~php submitted string is normalized to beRFC3986 compliant.
The `League\Uri\Components\Exception` extends PHP's SPL `InvalidArgumentException`.
## Manipulating the path as a filesystem path
The `HierarchicalPath` allows you to access and manipulate the path as if it was a filesystem path.
### Accessing the path
~~~php
getExtension(); //return 'txt'
$path->getBasename(); //return 'sky.txt'
$path->getDirname(); //return '/path/to/the'
~~~
### Modifying the path
~~~php
withExtension will throw an League\Uri\Components\Exception exception if the extension contains the path delimiter.
#### Usage
~~~php
withDirname('/foo')
->withExtension('csv');
echo $new_path; // display /foo/sky.csv;foo=bar
$alt_path = $path
->withBasename('paradise.html');
echo $alt_path; // display /path/to/the/paradise.html
~~~
## The path as a collection of segments
~~~php
To force the end slash when using the Path::createFromSegments method you need to add an empty string as the last member of the submitted array.
### Accessing the path segments
A path can be represented as an array of its internal segments. Through the use of the `HierarchicalPath::getSegments` method the class returns the object array representations.
~~~php
getSegments(); //return ['path', 'to', 'the', 'sky'];
$absolute_path = new HierarchicalPath('/path/to/the/sky/');
$absolute_path->getSegments(); //return ['path', 'to', 'the', 'sky', ''];
$relative_path = new HierarchicalPath('path/to/the/sky/');
$relative_path->getSegments(); //return ['path', 'to', 'the', 'sky', ''];
~~~
The class implements PHP's `Countable` and `IteratorAggregate` interfaces. This means that you can count the number of segments and use the `foreach` construct to iterate overs them.
~~~php
$segment) {
//do something meaningful here
}
~~~
### Accessing the segments offset
If you are interested in getting all the segments offsets you can do so using the `HierarchicalPath::keys` method like shown below:
~~~php
keys(); //return [0, 1, 2, 3];
$path->keys('sky'); //return [3];
$path->keys('gweta'); //return [];
~~~
The method returns all the segment keys, but if you supply an argument, only the keys whose segment value equals the argument are returned.
### Accessing the segments content
If you are only interested in a given segment you can access it directly using the `HierarchicalPath::getSegment` method as show below:
~~~php
getSegment(0); //return 'path'
$path->getSegment(23); //return null
$path->getSegment(23, 'now'); //return 'now'
~~~
If the offset does not exists it will return the value specified by the optional second argument or `null`.
~~~php
getSegment(-1); //return 'sky'
$path->getSegment(-23); //return null
$path->getSegment(-23, 'now'); //return 'now'
~~~
## Manipulating the path segments
### Append segments
To append segments to the current object you need to use the `HierarchicalPath::append` method. This method accept a single argument which represents the data to be appended. This data can be a string, an object which implements the `__toString` method or another `HierarchicalPath` object:
~~~php
append('path')->append('to/the/sky');
$newPath->__toString(); //return path/to/the/sky
~~~
### Prepend segments
To prepend segments to the current path you need to use the `HierarchicalPath::prepend` method. This method accept a single argument which represents the data to be prepended. This data can be a string, an object which implements the `__toString` method or another `HierarchicalPath` object:
~~~php
prepend('sky')->prepend('path/to/the');
$newPath->__toString(); //return path/to/the/sky
~~~
### Replace segments
To replace a segment you must use the `HierarchicalPath::replaceSegment` method with the following arguments:
- `$offset` which represents the segment offset to remove if it exists.
- `$data` which represents the data to be inject. This data can be a string, an object which implements the `__toString` method or another `HierarchicalPath` object.
~~~php
replaceSegment(0, 'bar/baz');
$newPath->__toString(); //return /bar/baz/example/com
~~~
### Remove segments
To remove segments from the current object and returns a new `HierarchicalPath` object without them you must use the `HierarchicalPath::withoutSegments` method. This method expects a single argument. This argument is an array containing a list of parameter names to remove.
~~~php
withoutSegments([0, 1]);
$newPath->__toString(); //return '/the/sky'
~~~