From: Kunal Mehta Date: Sun, 19 Aug 2018 10:15:31 +0000 (-0700) Subject: Support nested arrays in StaticArrayWriter X-Git-Tag: 1.34.0-rc.0~4286 X-Git-Url: http://git.cyclocoop.org/?a=commitdiff_plain;h=8a3bdfc633d04cc151ffbcd7e1b41edac4c8c4f9;p=lhc%2Fweb%2Fwiklou.git Support nested arrays in StaticArrayWriter This is needed by LCStoreStaticArray. Bug: T200626 Change-Id: I76abd3849381b3b98e350a4627f3515eeb00fa2d --- diff --git a/includes/libs/StaticArrayWriter.php b/includes/libs/StaticArrayWriter.php index cd1860ffe4..1e0e1dc9ce 100644 --- a/includes/libs/StaticArrayWriter.php +++ b/includes/libs/StaticArrayWriter.php @@ -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 = " $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; + } } diff --git a/tests/phpunit/includes/libs/StaticArrayWriterTest.php b/tests/phpunit/includes/libs/StaticArrayWriterTest.php index 276fee3f6c..4bd845d0b9 100644 --- a/tests/phpunit/includes/libs/StaticArrayWriterTest.php +++ b/tests/phpunit/includes/libs/StaticArrayWriterTest.php @@ -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;