From f083e0f782cf424c3b93b4c3cbacd51bfb635e5f Mon Sep 17 00:00:00 2001 From: David Rothstein Date: Sun, 23 Jun 2013 17:17:12 -0400 Subject: Issue #1850798 by damiankloip, ACF, geerlingguy, pfrenssen, David_Rothstein | mvc: Add a recursive version of array_diff_assoc(). --- includes/common.inc | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) (limited to 'includes') diff --git a/includes/common.inc b/includes/common.inc index 3ec68636c..9283766c2 100644 --- a/includes/common.inc +++ b/includes/common.inc @@ -6469,6 +6469,44 @@ function element_set_attributes(array &$element, array $map) { } } +/** + * Recursively computes the difference of arrays with additional index check. + * + * This is a version of array_diff_assoc() that supports multidimensional + * arrays. + * + * @param array $array1 + * The array to compare from. + * @param array $array2 + * The array to compare to. + * + * @return array + * Returns an array containing all the values from array1 that are not present + * in array2. + */ +function drupal_array_diff_assoc_recursive($array1, $array2) { + $difference = array(); + + foreach ($array1 as $key => $value) { + if (is_array($value)) { + if (!array_key_exists($key, $array2) || !is_array($array2[$key])) { + $difference[$key] = $value; + } + else { + $new_diff = drupal_array_diff_assoc_recursive($value, $array2[$key]); + if (!empty($new_diff)) { + $difference[$key] = $new_diff; + } + } + } + elseif (!array_key_exists($key, $array2) || $array2[$key] !== $value) { + $difference[$key] = $value; + } + } + + return $difference; +} + /** * Sets a value in a nested array with variable depth. * -- cgit v1.2.3