From de4269130ff9d8be092d395fa96eb27ecefeeeaa Mon Sep 17 00:00:00 2001 From: PrinsFrank <25006490+PrinsFrank@users.noreply.github.com> Date: Thu, 16 Jul 2026 19:48:07 +0200 Subject: [PATCH] Add support for nested dictionary Arrays --- .../DictionaryValue/Array/ArrayValue.php | 49 ++++++++++++++++++- .../DictionaryValue/Array/ArrayValueTest.php | 25 ++++++++++ 2 files changed, 73 insertions(+), 1 deletion(-) diff --git a/src/Document/Dictionary/DictionaryValue/Array/ArrayValue.php b/src/Document/Dictionary/DictionaryValue/Array/ArrayValue.php index 4a57673..317f35c 100644 --- a/src/Document/Dictionary/DictionaryValue/Array/ArrayValue.php +++ b/src/Document/Dictionary/DictionaryValue/Array/ArrayValue.php @@ -31,7 +31,54 @@ public static function fromValue(string $valueString): self|ReferenceValueArray| $sanitizedValueString = str_replace(['/', "\n"], [' /', ' '], rtrim(ltrim($sanitizedValueString, '[ '), ' ]')); $sanitizedValueString = preg_replace('/\s+/', ' ', $sanitizedValueString) ?? throw new RuntimeException('An error occurred while removing duplicate spaces from array value'); - $values = explode(' ', $sanitizedValueString); + + $values = []; + $buffer = null; + $strlen = strlen($sanitizedValueString); + for ($i = 0; $i < $strlen; $i++) { + $char = $sanitizedValueString[$i]; + if ($char === '[') { + if ($buffer !== null) { + $values[] = $buffer; + $buffer = null; + } + + $nestingLevel = 0; + for ($j = $i + 1; $j < $strlen; $j++) { + $char = $sanitizedValueString[$j]; + if ($char === '[') { + $nestingLevel++; + continue; + } + + if ($char === ']') { + if ($nestingLevel !== 0) { + $nestingLevel--; + continue; + } + + $values[] = substr($sanitizedValueString, $i, $j - $i + 1); + $i = $j; + continue 2; + } + } + } + + if ($char === ' ') { + if ($buffer !== null) { + $values[] = $buffer; + $buffer = null; + } + + continue; + } + + $buffer .= $char; + } + if ($buffer !== null) { + $values[] = $buffer; + } + if (count($values) % 3 === 0 && array_key_exists(2, $values) && $values[2] === 'R' diff --git a/tests/Unit/Document/Dictionary/DictionaryValue/Array/ArrayValueTest.php b/tests/Unit/Document/Dictionary/DictionaryValue/Array/ArrayValueTest.php index 075c000..635ead2 100644 --- a/tests/Unit/Document/Dictionary/DictionaryValue/Array/ArrayValueTest.php +++ b/tests/Unit/Document/Dictionary/DictionaryValue/Array/ArrayValueTest.php @@ -62,6 +62,31 @@ public function testFromValue(): void { EOD, ), ); + static::assertEquals( + new ArrayValue([1, new ArrayValue([2, 3]), 4]), + ArrayValue::fromValue( + <<