diff core/lib/Drupal/Component/Utility/DiffArray.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/lib/Drupal/Component/Utility/DiffArray.php	Wed Nov 29 16:09:58 2017 +0000
@@ -0,0 +1,50 @@
+<?php
+
+namespace Drupal\Component\Utility;
+
+/**
+ * Provides helpers to perform diffs on multi dimensional arrays.
+ *
+ * @ingroup utility
+ */
+class DiffArray {
+
+  /**
+   * 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.
+   */
+  public static function diffAssocRecursive(array $array1, array $array2) {
+    $difference = [];
+
+    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 = static::diffAssocRecursive($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;
+  }
+
+}