--- 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; +}