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;
+}
$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];
--- /dev/null
+<?php
+/**
+ * @group GlobalFunctions
+ * @covers ::wfArrayPlus2d
+ */
+class WfArrayPlus2dTest extends MediaWikiTestCase {
+ /**
+ * @dataProvider provideArrays
+ */
+ public function testWfArrayPlus2d( $baseArray, $newValues, $expected, $testName ) {
+ $this->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",
+ ),
+ );
+ }
+}