From: Florian Date: Thu, 27 Aug 2015 17:49:50 +0000 (+0200) Subject: Implement wfArrayPlus2d which combines 2d arrays X-Git-Tag: 1.31.0-rc.0~10182^2 X-Git-Url: http://git.cyclocoop.org//%27%40script%40/%27?a=commitdiff_plain;h=20f2df9c9f317d4bea1a984fee44f99c515e5454;p=lhc%2Fweb%2Fwiklou.git Implement wfArrayPlus2d which combines 2d arrays Moved the logic of ExtensionRegistrations array_plus_2d merge method out to it's own global function wfArrayPlus2d, so any other function in mediawiki core and it's extensions can use this method when they need to union a 2d array. Change-Id: I56afdf306e399a4a1505828ed76c60c1bfd033b6 --- diff --git a/includes/GlobalFunctions.php b/includes/GlobalFunctions.php index 9d89633494..b853d0781b 100644 --- a/includes/GlobalFunctions.php +++ b/includes/GlobalFunctions.php @@ -4273,3 +4273,28 @@ function wfThumbIsStandard( File $file, array $params ) { return true; } + +/** + * Merges two (possibly) 2 dimensional arrays into the target array ($baseArray). + * + * Values that exist in both values will be combined with += (all values of the array + * of $newValues will be added to the values of the array of $baseArray, while values, + * that exists in both, the value of $baseArray will be used). + * + * @param array $baseArray The array where you want to add the values of $newValues to + * @param array $newValues An array with new values + * @return array The combined array + * @since 1.26 + */ +function wfArrayPlus2d( array $baseArray, array $newValues ) { + // First merge items that are in both arrays + foreach ( $baseArray as $name => &$groupVal ) { + if ( isset( $newValues[$name] ) ) { + $groupVal += $newValues[$name]; + } + } + // Now add items that didn't exist yet + $baseArray += $newValues; + + return $baseArray; +} diff --git a/includes/registration/ExtensionRegistry.php b/includes/registration/ExtensionRegistry.php index b89518ad28..f838103928 100644 --- a/includes/registration/ExtensionRegistry.php +++ b/includes/registration/ExtensionRegistry.php @@ -222,14 +222,7 @@ class ExtensionRegistry { $GLOBALS[$key] = array_merge_recursive( $GLOBALS[$key], $val ); break; case 'array_plus_2d': - // First merge items that are in both arrays - foreach ( $GLOBALS[$key] as $name => &$groupVal ) { - if ( isset( $val[$name] ) ) { - $groupVal += $val[$name]; - } - } - // Now add items that didn't exist yet - $GLOBALS[$key] += $val; + $GLOBALS[$key] = wfArrayPlus2d( $GLOBALS[$key], $val ); break; case 'array_plus': $GLOBALS[$key] = $val + $GLOBALS[$key]; diff --git a/tests/phpunit/includes/GlobalFunctions/wfArrayPlus2dTest.php b/tests/phpunit/includes/GlobalFunctions/wfArrayPlus2dTest.php new file mode 100644 index 0000000000..88875bb012 --- /dev/null +++ b/tests/phpunit/includes/GlobalFunctions/wfArrayPlus2dTest.php @@ -0,0 +1,94 @@ +assertEquals( + $expected, + wfArrayPlus2d( $baseArray, $newValues ), + $testName + ); + } + + /** + * Provider for testing wfArrayPlus2d + * + * @return array + */ + public static function provideArrays() { + return array( + // target array, new values array, expected result + array( + array( 0 => '1dArray' ), + array( 1 => '1dArray' ), + array( 0 => '1dArray', 1 => '1dArray' ), + "Test simple union of two arrays with different keys", + ), + array( + array( + 0 => array( 0 => '2dArray' ), + ), + array( + 0 => array( 1 => '2dArray' ), + ), + array( + 0 => array( 0 => '2dArray', 1 => '2dArray' ), + ), + "Test union of 2d arrays with different keys in the value array", + ), + array( + array( + 0 => array( 0 => '2dArray' ), + ), + array( + 0 => array( 0 => '1dArray' ), + ), + array( + 0 => array( 0 => '2dArray' ), + ), + "Test union of 2d arrays with same keys in the value array", + ), + array( + array( + 0 => array( 0 => array( 0 => '3dArray' ) ), + ), + array( + 0 => array( 0 => array( 1 => '2dArray' ) ), + ), + array( + 0 => array( 0 => array( 0 => '3dArray' ) ), + ), + "Test union of 3d array with different keys", + ), + array( + array( + 0 => array( 0 => array( 0 => '3dArray' ) ), + ), + array( + 0 => array( 1 => array( 0 => '2dArray' ) ), + ), + array( + 0 => array( 0 => array( 0 => '3dArray' ), 1 => array( 0 => '2dArray' ) ), + ), + "Test union of 3d array with different keys in the value array", + ), + array( + array( + 0 => array( 0 => array( 0 => '3dArray' ) ), + ), + array( + 0 => array( 0 => array( 0 => '2dArray' ) ), + ), + array( + 0 => array( 0 => array( 0 => '3dArray' ) ), + ), + "Test union of 3d array with same keys in the value array", + ), + ); + } +}