From 54a18e30f2e93124251616b6c27f1ea15af22dcc Mon Sep 17 00:00:00 2001 From: Nat Zimmermann Date: Fri, 12 Aug 2016 10:35:50 +0100 Subject: [PATCH] Add support for checking if an array has multiple keys --- src/Illuminate/Support/Arr.php | 30 ++++++++++++++++++------------ tests/Support/SupportArrTest.php | 11 +++++++++++ 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/src/Illuminate/Support/Arr.php b/src/Illuminate/Support/Arr.php index 13aa89180675..d9b63d26e8c2 100755 --- a/src/Illuminate/Support/Arr.php +++ b/src/Illuminate/Support/Arr.php @@ -293,31 +293,37 @@ public static function get($array, $key, $default = null) } /** - * Check if an item exists in an array using "dot" notation. + * Check if an item or items exist in an array using "dot" notation. * * @param \ArrayAccess|array $array - * @param string $key + * @param string|array $keys * @return bool */ - public static function has($array, $key) + public static function has($array, $keys) { - if (! $array) { + if (is_null($keys)) { return false; } - if (is_null($key)) { + $keys = (array) $keys; + + if (! $array) { return false; } - if (static::exists($array, $key)) { - return true; + if ($keys === []) { + return false; } - foreach (explode('.', $key) as $segment) { - if (static::accessible($array) && static::exists($array, $segment)) { - $array = $array[$segment]; - } else { - return false; + foreach ($keys as $key) { + $subKeyArray = $array; + + foreach (explode('.', $key) as $segment) { + if (static::accessible($subKeyArray) && static::exists($subKeyArray, $segment)) { + $subKeyArray = $subKeyArray[$segment]; + } else { + return false; + } } } diff --git a/tests/Support/SupportArrTest.php b/tests/Support/SupportArrTest.php index b695bf612e59..13198e824ca7 100644 --- a/tests/Support/SupportArrTest.php +++ b/tests/Support/SupportArrTest.php @@ -241,6 +241,17 @@ public function testHas() $this->assertFalse(Arr::has(null, null)); $this->assertFalse(Arr::has([], null)); + + $array = ['products' => ['desk' => ['price' => 100]]]; + $this->assertTrue(Arr::has($array, ['products.desk'])); + $this->assertTrue(Arr::has($array, ['products.desk', 'products.desk.price'])); + $this->assertTrue(Arr::has($array, ['products', 'products'])); + $this->assertFalse(Arr::has($array, ['foo'])); + $this->assertFalse(Arr::has($array, [])); + $this->assertFalse(Arr::has($array, ['products.desk', 'products.price'])); + + $this->assertFalse(Arr::has([], [null])); + $this->assertFalse(Arr::has(null, [null])); } public function testIsAssoc()