diff --git a/src/Illuminate/Collections/Arr.php b/src/Illuminate/Collections/Arr.php index e499ef7c681..cadf87d5b77 100644 --- a/src/Illuminate/Collections/Arr.php +++ b/src/Illuminate/Collections/Arr.php @@ -116,6 +116,23 @@ public static function collapse($array) return array_merge([], ...$results); } + /** + * Determine if the given array contains a given value. + * + * @param \ArrayAccess|array $array + * @param mixed $value + * @param bool $strict + * @return bool + */ + public static function contains($array, $value, bool $strict = false): bool + { + if ($array instanceof Enumerable) { + return $strict ? $array->containsStrict($value) : $array->contains($value); + } + + return in_array($value, $array, $strict); + } + /** * Cross join the given arrays, returning all possible permutations. * @@ -154,6 +171,19 @@ public static function divide($array) return [array_keys($array), array_values($array)]; } + /** + * Determine if the given array does not contain a given value. + * + * @param \ArrayAccess|array $array + * @param mixed $value + * @param bool $strict + * @return bool + */ + public static function doestContains($array, $value, bool $strict = false): bool + { + return ! static::contains($array, $value, $strict); + } + /** * Flatten a multi-dimensional associative array with dots. * diff --git a/tests/Support/SupportArrTest.php b/tests/Support/SupportArrTest.php index efdf2c7759c..e8c44248418 100644 --- a/tests/Support/SupportArrTest.php +++ b/tests/Support/SupportArrTest.php @@ -94,6 +94,26 @@ public function testCollapse() $this->assertEquals([1, 2, 3, 'foo', 'bar', 'baz', 'boom'], Arr::collapse($mixedArray)); } + public function testContains() + { + $this->assertTrue(Arr::contains(['foo', 'bar'], 'foo')); + $this->assertTrue(Arr::contains(['foo', 'bar'], 'bar')); + $this->assertFalse(Arr::contains(['foo', 'bar'], 'baz')); + + $this->assertTrue(Arr::contains(['foo' => 'bar'], 'bar')); + $this->assertFalse(Arr::contains(['foo' => 'bar'], 'baz')); + + $this->assertTrue(Arr::contains(['Foo', 'Bar'], 'Foo', true)); + $this->assertFalse(Arr::contains(['Foo', 'Bar'], 'foo', true)); + + $this->assertTrue(Arr::contains(new Collection(['foo', 'bar']), 'foo')); + $this->assertTrue(Arr::contains(new Collection(['foo', 'bar']), 'bar')); + $this->assertFalse(Arr::contains(new Collection(['foo', 'bar']), 'baz')); + + $this->assertTrue(Arr::contains(new Collection(['Foo', 'Bar']), 'Foo', true)); + $this->assertFalse(Arr::contains(new Collection(['Foo', 'Bar']), 'foo', true)); + } + public function testCrossJoin() { // Single dimension @@ -177,6 +197,26 @@ public function testDivide(): void $this->assertEquals([['one' => 1, 2 => 'second'], 'one'], $values); } + public function testDoestContains() + { + $this->assertTrue(Arr::doestContains(['foo', 'bar'], 'baz')); + $this->assertFalse(Arr::doestContains(['foo', 'bar'], 'foo')); + $this->assertFalse(Arr::doestContains(['foo', 'bar'], 'bar')); + + $this->assertTrue(Arr::doestContains(['foo' => 'bar'], 'baz')); + $this->assertFalse(Arr::doestContains(['foo' => 'bar'], 'bar')); + + $this->assertTrue(Arr::doestContains(['Foo', 'Bar'], 'foo', true)); + $this->assertFalse(Arr::doestContains(['Foo', 'Bar'], 'Foo', true)); + + $this->assertTrue(Arr::doestContains(new Collection(['foo', 'bar']), 'baz')); + $this->assertFalse(Arr::doestContains(new Collection(['foo', 'bar']), 'foo')); + $this->assertFalse(Arr::doestContains(new Collection(['foo', 'bar']), 'bar')); + + $this->assertTrue(Arr::doestContains(new Collection(['Foo', 'Bar']), 'foo', true)); + $this->assertFalse(Arr::doestContains(new Collection(['Foo', 'Bar']), 'Foo', true)); + } + public function testDot() { $array = Arr::dot(['foo' => ['bar' => 'baz']]);