From 2470527571aeeb02e7860e5bc6bc9d46b9408bf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20H=C3=A4drich?= <11225821+shaedrich@users.noreply.github.com> Date: Fri, 24 Jul 2026 19:54:39 +0200 Subject: [PATCH 01/10] Add `concurrent` to `Arr` --- src/Illuminate/Collections/Arr.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/Illuminate/Collections/Arr.php b/src/Illuminate/Collections/Arr.php index 6c661f98bef3..5f9fc13b8200 100644 --- a/src/Illuminate/Collections/Arr.php +++ b/src/Illuminate/Collections/Arr.php @@ -4,12 +4,14 @@ use ArgumentCountError; use ArrayAccess; +use ArrayIterator; use Closure; use Illuminate\Contracts\Support\Arrayable; use Illuminate\Contracts\Support\Jsonable; use Illuminate\Support\Traits\Macroable; use InvalidArgumentException; use JsonSerializable; +use MultipleIterator; use Random\Randomizer; use SortDirection; use Traversable; @@ -1308,6 +1310,17 @@ public static function whereNotNull($array) return static::where($array, fn ($value) => ! is_null($value)); } + public static function concurrent(array ...$arguments) + { + $multipleIterator = new MultipleIterator(MultipleIterator::MIT_NEED_ALL|MultipleIterator::MIT_KEYS_ASSOC); + + foreach ($arguments as $idx => $array) { + $multipleIterator->attachIterator(new ArrayIterator($array), $idx); + } + + return $multipleIterator; + } + /** * If the given value is not an array and not null, wrap it in one. * From 89644df8dc67df0c4ebae78a90f47531ef15a4de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20H=C3=A4drich?= <11225821+shaedrich@users.noreply.github.com> Date: Fri, 24 Jul 2026 19:57:54 +0200 Subject: [PATCH 02/10] Set type flag dependent on array type --- src/Illuminate/Collections/Arr.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Illuminate/Collections/Arr.php b/src/Illuminate/Collections/Arr.php index 5f9fc13b8200..d04d84c13a92 100644 --- a/src/Illuminate/Collections/Arr.php +++ b/src/Illuminate/Collections/Arr.php @@ -1312,7 +1312,10 @@ public static function whereNotNull($array) public static function concurrent(array ...$arguments) { - $multipleIterator = new MultipleIterator(MultipleIterator::MIT_NEED_ALL|MultipleIterator::MIT_KEYS_ASSOC); + $typeFlag = array_all($arguments, fn ($value) => array_is_list($value)) + ? MultipleIterator::MIT_KEYS_ASSOC + : MultipleIterator::MIT_KEYS_NUMERIC; + $multipleIterator = new MultipleIterator(MultipleIterator::MIT_NEED_ALL|$typeFlag); foreach ($arguments as $idx => $array) { $multipleIterator->attachIterator(new ArrayIterator($array), $idx); From 2ad099c4d5952ec08fdf7e49cda58b32a8f957a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20H=C3=A4drich?= <11225821+shaedrich@users.noreply.github.com> Date: Fri, 24 Jul 2026 20:01:02 +0200 Subject: [PATCH 03/10] Use `*_ANY` instead of `*_ALL` as sensitive default --- src/Illuminate/Collections/Arr.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Illuminate/Collections/Arr.php b/src/Illuminate/Collections/Arr.php index d04d84c13a92..8667e2575aac 100644 --- a/src/Illuminate/Collections/Arr.php +++ b/src/Illuminate/Collections/Arr.php @@ -1315,7 +1315,7 @@ public static function concurrent(array ...$arguments) $typeFlag = array_all($arguments, fn ($value) => array_is_list($value)) ? MultipleIterator::MIT_KEYS_ASSOC : MultipleIterator::MIT_KEYS_NUMERIC; - $multipleIterator = new MultipleIterator(MultipleIterator::MIT_NEED_ALL|$typeFlag); + $multipleIterator = new MultipleIterator(MultipleIterator::MIT_NEED_ANY|$typeFlag); foreach ($arguments as $idx => $array) { $multipleIterator->attachIterator(new ArrayIterator($array), $idx); From c8eca9f4c045f038d681b3f859b3997ccea487b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20H=C3=A4drich?= <11225821+shaedrich@users.noreply.github.com> Date: Fri, 24 Jul 2026 20:06:43 +0200 Subject: [PATCH 04/10] Add test for `Arr::concurrent()` --- tests/Support/SupportArrTest.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tests/Support/SupportArrTest.php b/tests/Support/SupportArrTest.php index 0653262c7ca1..cbcdbde59d71 100644 --- a/tests/Support/SupportArrTest.php +++ b/tests/Support/SupportArrTest.php @@ -11,6 +11,7 @@ use Illuminate\Support\MultipleItemsFoundException; use InvalidArgumentException; use PHPUnit\Framework\Attributes\IgnoreDeprecations; +use PHPUnit\Framework\Attributes\TestWith; use PHPUnit\Framework\TestCase; use stdClass; use WeakMap; @@ -1962,4 +1963,17 @@ public function testPartition() $this->assertEquals([[0 => 'John', 1 => 'Jane'], [2 => 'Greg']], $result); } + + #[TestWith([[[1, 2], [3, 4]], [2, 4, 6, 8]])] + #[TestWith([[['a' => 1, 'b' => 2], ['c' => 3, 'd' => 4]], [2, 4, 6, 8]])] + public function testConcurrent(array $input, array $output) + { + $result = []; + + foreach (Arr::concurrent(...$input) as $key => [$c, $d]) { + array_push($result, ...array_map(fn ($value) => $value * 2), [$c, $d]) + } + + $this->assertEquals($output, $result); + } } From 78917eb0e135282300773a533d29efc229aaa99b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20H=C3=A4drich?= <11225821+shaedrich@users.noreply.github.com> Date: Fri, 24 Jul 2026 20:13:13 +0200 Subject: [PATCH 05/10] StyleCI --- src/Illuminate/Collections/Arr.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Illuminate/Collections/Arr.php b/src/Illuminate/Collections/Arr.php index 8667e2575aac..6228212999a4 100644 --- a/src/Illuminate/Collections/Arr.php +++ b/src/Illuminate/Collections/Arr.php @@ -1316,11 +1316,11 @@ public static function concurrent(array ...$arguments) ? MultipleIterator::MIT_KEYS_ASSOC : MultipleIterator::MIT_KEYS_NUMERIC; $multipleIterator = new MultipleIterator(MultipleIterator::MIT_NEED_ANY|$typeFlag); - + foreach ($arguments as $idx => $array) { $multipleIterator->attachIterator(new ArrayIterator($array), $idx); } - + return $multipleIterator; } From 71a586ed492d97b7a7d874c2bad25e403d5d5db5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20H=C3=A4drich?= <11225821+shaedrich@users.noreply.github.com> Date: Fri, 24 Jul 2026 20:14:08 +0200 Subject: [PATCH 06/10] Add missing semicolon --- tests/Support/SupportArrTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Support/SupportArrTest.php b/tests/Support/SupportArrTest.php index cbcdbde59d71..4b6754091fa3 100644 --- a/tests/Support/SupportArrTest.php +++ b/tests/Support/SupportArrTest.php @@ -1971,7 +1971,7 @@ public function testConcurrent(array $input, array $output) $result = []; foreach (Arr::concurrent(...$input) as $key => [$c, $d]) { - array_push($result, ...array_map(fn ($value) => $value * 2), [$c, $d]) + array_push($result, ...array_map(fn ($value) => $value * 2), [$c, $d]); } $this->assertEquals($output, $result); From 70113c9edbffecc299ccbd79b7d1357f0e528a5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20H=C3=A4drich?= <11225821+shaedrich@users.noreply.github.com> Date: Fri, 24 Jul 2026 20:14:53 +0200 Subject: [PATCH 07/10] StyleCI --- src/Illuminate/Collections/Arr.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Illuminate/Collections/Arr.php b/src/Illuminate/Collections/Arr.php index 6228212999a4..fe2018138044 100644 --- a/src/Illuminate/Collections/Arr.php +++ b/src/Illuminate/Collections/Arr.php @@ -1315,7 +1315,7 @@ public static function concurrent(array ...$arguments) $typeFlag = array_all($arguments, fn ($value) => array_is_list($value)) ? MultipleIterator::MIT_KEYS_ASSOC : MultipleIterator::MIT_KEYS_NUMERIC; - $multipleIterator = new MultipleIterator(MultipleIterator::MIT_NEED_ANY|$typeFlag); + $multipleIterator = new MultipleIterator(MultipleIterator::MIT_NEED_ANY | $typeFlag); foreach ($arguments as $idx => $array) { $multipleIterator->attachIterator(new ArrayIterator($array), $idx); From 1825e9a1d25ac73c56d91c8273562ba06439b271 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20H=C3=A4drich?= <11225821+shaedrich@users.noreply.github.com> Date: Fri, 24 Jul 2026 20:16:26 +0200 Subject: [PATCH 08/10] StyleCI --- tests/Support/SupportArrTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Support/SupportArrTest.php b/tests/Support/SupportArrTest.php index 4b6754091fa3..6eef05799af7 100644 --- a/tests/Support/SupportArrTest.php +++ b/tests/Support/SupportArrTest.php @@ -1973,7 +1973,7 @@ public function testConcurrent(array $input, array $output) foreach (Arr::concurrent(...$input) as $key => [$c, $d]) { array_push($result, ...array_map(fn ($value) => $value * 2), [$c, $d]); } - + $this->assertEquals($output, $result); } } From b67bd62bc9b69eb1e2e52aa0b0108a04ef23609b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20H=C3=A4drich?= <11225821+shaedrich@users.noreply.github.com> Date: Fri, 24 Jul 2026 20:17:14 +0200 Subject: [PATCH 09/10] Simplify test --- tests/Support/SupportArrTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Support/SupportArrTest.php b/tests/Support/SupportArrTest.php index 6eef05799af7..6720ec854ed6 100644 --- a/tests/Support/SupportArrTest.php +++ b/tests/Support/SupportArrTest.php @@ -1971,7 +1971,7 @@ public function testConcurrent(array $input, array $output) $result = []; foreach (Arr::concurrent(...$input) as $key => [$c, $d]) { - array_push($result, ...array_map(fn ($value) => $value * 2), [$c, $d]); + array_push($result, $c * 2, $d * 2); } $this->assertEquals($output, $result); From 756c81ad52aee49e9da7dfb864667cf1c0eb2945 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20H=C3=A4drich?= <11225821+shaedrich@users.noreply.github.com> Date: Fri, 24 Jul 2026 20:23:21 +0200 Subject: [PATCH 10/10] Correct order --- tests/Support/SupportArrTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Support/SupportArrTest.php b/tests/Support/SupportArrTest.php index 6720ec854ed6..c53c09ae5248 100644 --- a/tests/Support/SupportArrTest.php +++ b/tests/Support/SupportArrTest.php @@ -1964,8 +1964,8 @@ public function testPartition() $this->assertEquals([[0 => 'John', 1 => 'Jane'], [2 => 'Greg']], $result); } - #[TestWith([[[1, 2], [3, 4]], [2, 4, 6, 8]])] - #[TestWith([[['a' => 1, 'b' => 2], ['c' => 3, 'd' => 4]], [2, 4, 6, 8]])] + #[TestWith([[[1, 2], [3, 4]], [2, 6, 4, 8]])] + #[TestWith([[['a' => 1, 'b' => 2], ['c' => 3, 'd' => 4]], [2, 6, 4, 8]])] public function testConcurrent(array $input, array $output) { $result = [];