From deb644f931f232cea309ad8ff4453b1844b5f234 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Mon, 17 Jun 2024 22:21:54 +0200 Subject: [PATCH] count items recursively --- src/Exporter.php | 64 ++++++++++++++++++++++++------------------ tests/ExporterTest.php | 6 +++- 2 files changed, 41 insertions(+), 29 deletions(-) diff --git a/src/Exporter.php b/src/Exporter.php index 911663e..090da39 100644 --- a/src/Exporter.php +++ b/src/Exporter.php @@ -63,41 +63,19 @@ public function export(mixed $value, int $indentation = 0): string public function shortenedRecursiveExport(array &$data, ?RecursionContext $processed = null): string { - $result = []; - if (!$processed) { $processed = new RecursionContext; } + $overallCount = count($data, COUNT_RECURSIVE); + $counter = 0; - $array = $data; - - /* @noinspection UnusedFunctionResultInspection */ - $processed->add($data); - - $i = 0; - $count = count($data, COUNT_RECURSIVE); - - foreach ($array as $key => $value) { - if ($count > $this->shortenArraysLongerThan && $i > $this->shortenArraysLongerThan) { - $result[] = sprintf('...%d more elements', $count - $this->shortenArraysLongerThan); - - break; - } - - if (is_array($value)) { - if ($processed->contains($data[$key]) !== false) { - $result[] = '*RECURSION*'; - } else { - $result[] = '[' . $this->shortenedRecursiveExport($data[$key], $processed) . ']'; - } - } else { - $result[] = $this->shortenedExport($value); - } + $export = $this->_shortenedRecursiveExport($data, $processed, $overallCount, $counter); - $i++; + if ($overallCount > $this->shortenArraysLongerThan) { + $export .= sprintf(' ...%d more elements', $overallCount - $this->shortenArraysLongerThan); } - return implode(', ', $result); + return $export; } /** @@ -211,6 +189,36 @@ public function toArray(mixed $value): array return $array; } + private function _shortenedRecursiveExport(array &$data, RecursionContext $processed, int $overallCount, int &$counter): string + { + $result = []; + + $array = $data; + + /* @noinspection UnusedFunctionResultInspection */ + $processed->add($data); + + foreach ($array as $key => $value) { + if ($overallCount > $this->shortenArraysLongerThan && $counter > $this->shortenArraysLongerThan) { + break; + } + + if (is_array($value)) { + if ($processed->contains($data[$key]) !== false) { + $result[] = '*RECURSION*'; + } else { + $result[] = '[' . $this->_shortenedRecursiveExport($data[$key], $processed, $overallCount, $counter) . ']'; + } + } else { + $result[] = $this->shortenedExport($value); + } + + $counter++; + } + + return implode(', ', $result); + } + private function recursiveExport(mixed &$value, int $indentation = 0, ?RecursionContext $processed = null): string { if ($value === null) { diff --git a/tests/ExporterTest.php b/tests/ExporterTest.php index 157356f..d99572d 100644 --- a/tests/ExporterTest.php +++ b/tests/ExporterTest.php @@ -327,6 +327,9 @@ public static function shortenedRecursiveExportProvider(): array $bigArray[] = 'cast(\'foo' . $i . '\' as blob)'; } + $array = [1, 2, 'hello', 'world', true, false]; + $deepArray = [$array, [$array, [$array, [$array, [$array, [$array, [$array, [$array, [$array, [$array]]]]]]]]]]; + return [ 'null' => [[null], 'null'], 'boolean true' => [[true], 'true'], @@ -339,7 +342,8 @@ public static function shortenedRecursiveExportProvider(): array 'with assoc array key' => [['foo' => 'bar'], '\'bar\''], 'multidimensional array' => [[[1, 2, 3], [3, 4, 5]], '[1, 2, 3], [3, 4, 5]'], 'object' => [[new stdClass], 'stdClass Object ()'], - 'big array' => [$bigArray, "'cast('foo0' as blob)', 'cast('foo1' as blob)', 'cast('foo2' as blob)', 'cast('foo3' as blob)', 'cast('foo4' as blob)', 'cast('foo5' as blob)', 'cast('foo6' as blob)', 'cast('foo7' as blob)', 'cast('foo8' as blob)', 'cast('foo9' as blob)', 'cast('foo10' as blob)', ...19992 more elements"], + 'big array' => [$bigArray, "'cast('foo0' as blob)', 'cast('foo1' as blob)', 'cast('foo2' as blob)', 'cast('foo3' as blob)', 'cast('foo4' as blob)', 'cast('foo5' as blob)', 'cast('foo6' as blob)', 'cast('foo7' as blob)', 'cast('foo8' as blob)', 'cast('foo9' as blob)', 'cast('foo10' as blob)' ...19990 more elements"], + 'deep array' => [$deepArray, "[1, 2, 'hello', 'world', true, false], [[1, 2, 'hello', 'world']] ...69 more elements"], ]; }