Skip to content

Commit 47de756

Browse files
authored
refactor data_has (#57580)
1 parent d91db74 commit 47de756

File tree

2 files changed

+38
-6
lines changed

2 files changed

+38
-6
lines changed

src/Illuminate/Collections/helpers.php

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,19 +44,23 @@ function data_fill(&$target, $key, $value)
4444
*/
4545
function data_has($target, $key): bool
4646
{
47-
if (Arr::accessible($target)) {
48-
return Arr::has($target, $key);
47+
if (empty($key)) {
48+
return false;
4949
}
5050

5151
$key = is_array($key) ? $key : explode('.', $key);
5252

53-
while ($property = array_shift($key)) {
54-
if (property_exists($target, $property)) {
55-
return $key ? data_has($target->{$property}, $key) : true;
53+
foreach ($key as $segment) {
54+
if (Arr::accessible($target) && Arr::exists($target, $segment)) {
55+
$target = $target[$segment];
56+
} elseif (is_object($target) && property_exists($target, $segment)) {
57+
$target = $target->{$segment};
58+
} else {
59+
return false;
5660
}
5761
}
5862

59-
return false;
63+
return true;
6064
}
6165
}
6266

tests/Support/SupportHelpersTest.php

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,34 @@ public function testObjectGetWhenKeyIsNullOrEmpty()
218218
$this->assertEquals($object, object_get($object, ' '));
219219
}
220220

221+
public function testDataHas()
222+
{
223+
$object = (object) ['users' => ['name' => ['Taylor', 'Otwell']]];
224+
$array = [(object) ['users' => [(object) ['name' => 'Taylor']]]];
225+
$dottedArray = ['users' => ['first.name' => 'Taylor', 'middle.name' => null]];
226+
$arrayAccess = new SupportTestArrayAccess(['price' => 56, 'user' => new SupportTestArrayAccess(['name' => 'John']), 'email' => null]);
227+
$sameKeyMultiLevel = (object) ['name' => 'Taylor', 'company' => ['name' => 'Laravel']];
228+
229+
$this->assertTrue(data_has($object, 'users.name.0'));
230+
$this->assertTrue(data_has($array, '0.users.0.name'));
231+
$this->assertFalse(data_has($array, '0.users.3'));
232+
$this->assertFalse(data_has($array, '0.users.3'));
233+
$this->assertFalse(data_has($array, '0.users.3'));
234+
$this->assertTrue(data_has($dottedArray, ['users', 'first.name']));
235+
$this->assertTrue(data_has($dottedArray, ['users', 'middle.name']));
236+
$this->assertFalse(data_has($dottedArray, ['users', 'last.name']));
237+
$this->assertTrue(data_has($arrayAccess, 'price'));
238+
$this->assertTrue(data_has($arrayAccess, 'user.name'));
239+
$this->assertFalse(data_has($arrayAccess, 'foo'));
240+
$this->assertFalse(data_has($arrayAccess, 'user.foo'));
241+
$this->assertFalse(data_has($arrayAccess, 'foo'));
242+
$this->assertFalse(data_has($arrayAccess, 'user.foo'));
243+
$this->assertTrue(data_has($arrayAccess, 'email'));
244+
$this->assertTrue(data_has($sameKeyMultiLevel, 'name'));
245+
$this->assertTrue(data_has($sameKeyMultiLevel, 'company.name'));
246+
$this->assertFalse(data_has($sameKeyMultiLevel, 'foo.name'));
247+
}
248+
221249
public function testDataGet()
222250
{
223251
$object = (object) ['users' => ['name' => ['Taylor', 'Otwell']]];

0 commit comments

Comments
 (0)