mirror of
https://github.com/shlinkio/shlink.git
synced 2026-03-07 15:53:13 +08:00
68 lines
1.5 KiB
PHP
68 lines
1.5 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
|
|
namespace Shlinkio\Shlink\Common\Collection;
|
|
|
|
use function array_key_exists;
|
|
use function array_shift;
|
|
use function is_array;
|
|
|
|
final class PathCollection
|
|
{
|
|
/**
|
|
* @var array
|
|
*/
|
|
private $array;
|
|
|
|
public function __construct(array $array)
|
|
{
|
|
$this->array = $array;
|
|
}
|
|
|
|
public function pathExists(array $path): bool
|
|
{
|
|
return $this->checkPathExists($path, $this->array);
|
|
}
|
|
|
|
private function checkPathExists(array $path, array $array): bool
|
|
{
|
|
// As soon as a step is not found, the path does not exist
|
|
$step = array_shift($path);
|
|
if (! array_key_exists($step, $array)) {
|
|
return false;
|
|
}
|
|
|
|
// Once the path is empty, we have found all the parts in the path
|
|
if (empty($path)) {
|
|
return true;
|
|
}
|
|
|
|
// If current value is not an array, then we have not found the path
|
|
$newArray = $array[$step];
|
|
if (! is_array($newArray)) {
|
|
return false;
|
|
}
|
|
|
|
return $this->checkPathExists($path, $newArray);
|
|
}
|
|
|
|
/**
|
|
* @return mixed
|
|
*/
|
|
public function getValueInPath(array $path)
|
|
{
|
|
$array = $this->array;
|
|
|
|
do {
|
|
$step = array_shift($path);
|
|
if (! is_array($array) || ! array_key_exists($step, $array)) {
|
|
return null;
|
|
}
|
|
|
|
$array = $array[$step];
|
|
} while (! empty($path));
|
|
|
|
return $array;
|
|
}
|
|
}
|