assertEquals( ['b' => -2, 'c' => ['d' => 4, 'e' => ['f' => -5]], 'g' => 7], ArrayUtils::getChanges( ['a' => 1, 'b' => 2, 'c' => ['d' => 4, 'e' => ['f' => 5]]], ['a' => 1, 'b' => -2, 'c' => ['d' => 4, 'e' => ['f' => -5]], 'g' => 7], ) ); // Recursive $this->assertEquals( ['b' => -2, 'c' => ['e' => ['f' => -5]], 'g' => 7], ArrayUtils::getChanges( ['a' => 1, 'b' => 2, 'c' => ['d' => 4, 'e' => ['f' => 5]]], ['a' => 1, 'b' => -2, 'c' => ['d' => 4, 'e' => ['f' => -5]], 'g' => 7], true ) ); // Recursive with unchanged sub array $this->assertEquals( ['b' => -2], ArrayUtils::getChanges( ['a' => 1, 'b' => 2, 'c' => ['d' => 4, 'e' => ['f' => 5]]], ['a' => 1, 'b' => -2, 'c' => ['d' => 4, 'e' => ['f' => 5]]], true ) ); // No changes $this->assertEquals( [], ArrayUtils::getChanges( ['a' => 1, 'b' => 2, 'c' => ['d' => 4, 'e' => ['f' => 5]]], ['a' => 1, 'b' => 2, 'c' => ['d' => 4, 'e' => ['f' => 5]]], ) ); // Empty arrays $this->assertEquals( [], ArrayUtils::getChanges( [], [], ) ); // First array is empty $this->assertEquals( ['a' => 1], ArrayUtils::getChanges( [], ['a' => 1], ) ); // With callback $this->assertEquals( ['a' => 2], ArrayUtils::getChanges( ['a' => 1, 'b' => ''], ['a' => 2, 'b' => null], false, static function ($v1, $v2) { return ($v1 ?? '') === ($v2 ?? ''); } ) ); } }