--- includes/common.inc 2009-10-13 16:22:23.000000000 +0200
+++ includes/common.inc.new 2009-10-13 16:22:12.000000000 +0200
@@ -2579,7 +2579,7 @@ function drupal_get_js($scope = 'header'
foreach ($items as $item) {
switch ($item['type']) {
case 'setting':
- $output .= '\n";
+ $output .= '\n";
break;
case 'inline':
@@ -4218,3 +4218,43 @@ function _drupal_flush_css_js() {
}
variable_set('css_js_query_string', $new_character . substr($string_history, 0, 19));
}
+
+/**
+ * array_merge_recursive does indeed merge arrays, but it converts values with duplicate
+ * keys to arrays rather than overwriting the value in the first array with the duplicate
+ * value in the second array, as array_merge does. I.e., with array_merge_recursive,
+ * this happens (documented behavior):
+ *
+ * array_merge_recursive(array('key' => 'org value'), array('key' => 'new value'));
+ * => array('key' => array('org value', 'new value'));
+ *
+ * array_merge_recursive_distinct does not change the datatypes of the values in the arrays.
+ * Matching keys' values in the second array overwrite those in the first array, as is the
+ * case with array_merge, i.e.:
+ *
+ * array_merge_recursive_distinct(array('key' => 'org value'), array('key' => 'new value'));
+ * => array('key' => array('new value'));
+ *
+ * Parameters are passed by reference, though only for performance reasons. They're not
+ * altered by this function.
+ *
+ * @param array $array1
+ * @param array $array2
+ * @return array
+ * @author Daniel
+ * @author Gabriel Sobrinho
+ */
+function array_merge_recursive_distinct(array &$array1, array &$array2)
+{
+ $merged = $array1;
+ foreach ($array2 as $key => &$value)
+ {
+ if (is_array($value) && isset($merged[$key]) && is_array($merged[$key])) {
+ $merged[$key] = array_merge_recursive_distinct($merged[$key], $value);
+ }
+ else {
+ $merged[$key] = $value;
+ }
+ }
+ return $merged;
+}