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 ?? ''); } ) ); } public function testGetAndCast(): void { $this->assertEquals( 123, ArrayUtils::getAndCast(['a' => '123'], 'a', 'int') ); $this->assertEquals( null, ArrayUtils::getAndCast(['b' => '123'], 'a', 'int') ); } }