Support nested arrays in StaticArrayWriter
authorKunal Mehta <legoktm@member.fsf.org>
Sun, 19 Aug 2018 10:15:31 +0000 (03:15 -0700)
committerKrinkle <krinklemail@gmail.com>
Mon, 27 Aug 2018 22:23:02 +0000 (22:23 +0000)
This is needed by LCStoreStaticArray.

Bug: T200626
Change-Id: I76abd3849381b3b98e350a4627f3515eeb00fa2d

includes/libs/StaticArrayWriter.php
tests/phpunit/includes/libs/StaticArrayWriterTest.php

index cd1860f..1e0e1dc 100644 (file)
@@ -26,24 +26,47 @@ namespace Wikimedia;
 class StaticArrayWriter {
 
        /**
-        * @param string[] $data Array with string keys/values to export
+        * @param array $data Array with keys/values to export
         * @param string $header
         *
         * @return string PHP code
         */
        public function create( array $data, $header = 'Automatically generated' ) {
-               $format = "\t%s => %s,\n";
                $code = "<?php\n"
                        . "// " . implode( "\n// ", explode( "\n", $header ) ) . "\n"
                        . "return [\n";
                foreach ( $data as $key => $value ) {
-                       $code .= sprintf(
-                               $format,
-                               var_export( $key, true ),
-                               var_export( $value, true )
-                       );
+                       $code .= $this->encode( $key, $value, 1 );
                }
                $code .= "];\n";
                return $code;
        }
+
+       /**
+        * Recursively turn one k/v pair into properly-indented PHP
+        *
+        * @param string|int $key
+        * @param array|mixed $value
+        * @param int $indent Indentation level
+        *
+        * @return string
+        */
+       private function encode( $key, $value, $indent ) {
+               $tabs = str_repeat( "\t", $indent );
+               $line = $tabs .
+                       var_export( $key, true ) .
+                       ' => ';
+               if ( is_array( $value ) ) {
+                       $line .= "[\n";
+                       foreach ( $value as $key2 => $value2 ) {
+                               $line .= $this->encode( $key2, $value2, $indent + 1 );
+                       }
+                       $line .= "$tabs]";
+               } else {
+                       $line .= var_export( $value, true );
+               }
+
+               $line .= ",\n";
+               return $line;
+       }
 }
index 276fee3..4bd845d 100644 (file)
@@ -29,6 +29,8 @@ class StaticArrayWriterTest extends PHPUnit\Framework\TestCase {
                        'foo' => 'bar',
                        'baz' => 'rawr',
                        "they're" => '"quoted properly"',
+                       'nested' => [ 'elements', 'work' ],
+                       'and' => [ 'these' => 'do too' ],
                ];
                $writer = new StaticArrayWriter();
                $actual = $writer->create( $data, "Header\nWith\nNewlines" );
@@ -41,6 +43,13 @@ return [
        'foo' => 'bar',
        'baz' => 'rawr',
        'they\'re' => '"quoted properly"',
+       'nested' => [
+               0 => 'elements',
+               1 => 'work',
+       ],
+       'and' => [
+               'these' => 'do too',
+       ],
 ];
 
 PHP;