|
Server : Apache/2.4.62 System : FreeBSD fbsdweb2.web.rcn.net 14.1-RELEASE FreeBSD 14.1-RELEASE releng/14.1-n267679-10e31f0946d8 GENERIC amd64 User : www ( 80) PHP Version : 8.3.8 Disable Function : NONE Directory : /domains/irtiweb/CATS/vendor/sebastian/object-enumerator/src/ |
Upload File : |
<?php
/*
* This file is part of Object Enumerator.
*
* (c) Sebastian Bergmann <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace SebastianBergmann\ObjectEnumerator;
use SebastianBergmann\RecursionContext\Context;
/**
* Traverses array structures and object graphs
* to enumerate all referenced objects.
*/
class Enumerator
{
/**
* Returns an array of all objects referenced either
* directly or indirectly by a variable.
*
* @param array|object $variable
*
* @return object[]
*/
public function enumerate($variable)
{
if (!is_array($variable) && !is_object($variable)) {
throw new InvalidArgumentException;
}
if (isset(func_get_args()[1])) {
if (!func_get_args()[1] instanceof Context) {
throw new InvalidArgumentException;
}
$processed = func_get_args()[1];
} else {
$processed = new Context;
}
$objects = [];
if ($processed->contains($variable)) {
return $objects;
}
$processed->add($variable);
if (is_array($variable)) {
foreach ($variable as $element) {
if (!is_array($element) && !is_object($element)) {
continue;
}
$objects = array_merge(
$objects,
$this->enumerate($element, $processed)
);
}
} else {
$objects[] = $variable;
$reflector = new \ReflectionObject($variable);
foreach ($reflector->getProperties() as $attribute) {
$attribute->setAccessible(true);
$value = $attribute->getValue($variable);
if (!is_array($value) && !is_object($value)) {
continue;
}
$objects = array_merge(
$objects,
$this->enumerate($value, $processed)
);
}
}
return $objects;
}
}