diff --git a/includes/utilities.inc b/includes/utilities.inc index df48c8519b5fed4f8fbb5c8fa09c90d09260d2e7..0eee637c5a4845d5bffc71c2990183b2e91deacd 100644 --- a/includes/utilities.inc +++ b/includes/utilities.inc @@ -295,3 +295,39 @@ function advagg_string_ends_with($haystack, $needle) { } return substr_compare($haystack, $needle, $haystack_len -$needle_len, $needle_len, TRUE) === 0; } + +if (!function_exists('array_merge_recursive_distinct')) { + /** + * Merges any number of arrays / parameters recursively, replacing + * entries with string keys with values from latter arrays. + * If the entry or the next value to be assigned is an array, then it + * automagically treats both arguments as an array. + * Numeric entries are appended, not replaced, but only if they are + * unique + * + * calling: result = array_merge_recursive_distinct(a1, a2, ... aN) + **/ + + function array_merge_recursive_distinct () { + $arrays = func_get_args(); + $base = array_shift($arrays); + if(!is_array($base)) $base = empty($base) ? array() : array($base); + foreach($arrays as $append) { + if(!is_array($append)) $append = array($append); + foreach($append as $key => $value) { + if(!array_key_exists($key, $base) and !is_numeric($key)) { + $base[$key] = $append[$key]; + continue; + } + if(is_array($value) or is_array($base[$key])) { + $base[$key] = array_merge_recursive_distinct($base[$key], $append[$key]); + } else if(is_numeric($key)) { + if(!in_array($value, $base)) $base[] = $value; + } else { + $base[$key] = $value; + } + } + } + return $base; + } +}