rogervila/array-diff-multidimensional
Installation
composer require rogervila/array-diff-multidimensional
No additional configuration is required—just autoload the package.
Basic Usage
use Rogervila\ArrayDiffMultidimensional\ArrayDiff;
$array1 = ['a' => 1, 'b' => ['x' => 10, 'y' => 20]];
$array2 = ['a' => 1, 'b' => ['x' => 10, 'y' => 30]];
$diff = ArrayDiff::diff($array1, $array2);
// Returns: ['b' => ['y' => 30]]
First Use Case Compare two nested API responses or database records to identify changes:
$oldUser = User::find(1)->toArray();
$newUser = $request->validate()->merge($oldUser)->toArray();
$changes = ArrayDiff::diff($oldUser, $newUser);
Change Detection in Laravel Use with Eloquent models to track field changes:
$original = $model->getOriginal();
$changes = ArrayDiff::diff($original, $model->toArray());
Deep Merging with Conditional Logic
Combine with array_merge_recursive to preserve unchanged values:
$merged = array_merge_recursive(
$array1,
ArrayDiff::diff($array1, $array2)
);
Diff for Form Validation Validate nested form submissions against a base structure:
$validated = $request->validate(['data' => 'required|array']);
$diff = ArrayDiff::diff($baseConfig, $validated['data']);
if (!empty($diff)) {
throw new \Exception("Invalid nested fields");
}
Integration with Laravel Collections Process diffs in bulk:
$users = User::all();
$diffs = $users->map(fn ($user) => ArrayDiff::diff(
$user->getOriginal(),
$user->toArray()
));
ArrayDiff::diff($array1, $array2, 3) to restrict recursion depth for large arrays.Key Order Sensitivity The package preserves key order from the first array. If order matters, ensure consistency:
ksort($array1); ksort($array2); // Normalize before diffing
Non-Array Values
Passing non-array inputs throws InvalidArgumentException. Validate inputs:
if (!is_array($array1) || !is_array($array2)) {
throw new \InvalidArgumentException("Inputs must be arrays");
}
Circular References
Infinite recursion occurs with circular references. Use ArrayDiff::diff($array1, $array2, null, true) to detect cycles.
Type Juggling
Values like 0 (integer) vs. '0' (string) are treated as equal. Use strict comparison if needed:
$diff = ArrayDiff::diff($array1, $array2, null, false, true); // Strict mode
$diff = ArrayDiff::diff($array1, $array2, null, false, false, true);
\Log::debug('Array Diff:', ['diff' => $diff]);
Custom Diff Strategies Override the default comparator:
ArrayDiff::setComparator(function ($oldVal, $newVal) {
return $oldVal === $newVal || (is_numeric($oldVal) && is_numeric($newVal));
});
Event Hooks Extend with events (e.g., pre/post-diff hooks) via traits or decorators.
Laravel Service Provider Bind the diff service for dependency injection:
$this->app->singleton(ArrayDiff::class, function () {
return new ArrayDiff();
});
How can I help you explore Laravel packages today?