1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- <?php declare(strict_types=1);
- /*
- * This file is part of sebastian/object-enumerator.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\ObjectEnumerator;
- use function array_merge;
- use function is_array;
- use function is_object;
- use SebastianBergmann\ObjectReflector\ObjectReflector;
- use SebastianBergmann\RecursionContext\Context;
- final class Enumerator
- {
- /**
- * @psalm-return list<object>
- */
- public function enumerate(array|object $variable, Context $processed = new Context): array
- {
- $objects = [];
- if ($processed->contains($variable)) {
- return $objects;
- }
- $array = $variable;
- /* @noinspection UnusedFunctionResultInspection */
- $processed->add($variable);
- if (is_array($variable)) {
- foreach ($array as $element) {
- if (!is_array($element) && !is_object($element)) {
- continue;
- }
- /** @noinspection SlowArrayOperationsInLoopInspection */
- $objects = array_merge(
- $objects,
- $this->enumerate($element, $processed)
- );
- }
- return $objects;
- }
- $objects[] = $variable;
- foreach ((new ObjectReflector)->getProperties($variable) as $value) {
- if (!is_array($value) && !is_object($value)) {
- continue;
- }
- /** @noinspection SlowArrayOperationsInLoopInspection */
- $objects = array_merge(
- $objects,
- $this->enumerate($value, $processed)
- );
- }
- return $objects;
- }
- }
|