diff --git a/src/Illuminate/Collections/Arr.php b/src/Illuminate/Collections/Arr.php index 6c661f98bef3..fe2018138044 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,20 @@ public static function whereNotNull($array) return static::where($array, fn ($value) => ! is_null($value)); } + 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); + + 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. * diff --git a/tests/Support/SupportArrTest.php b/tests/Support/SupportArrTest.php index 0653262c7ca1..c53c09ae5248 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, 6, 4, 8]])] + #[TestWith([[['a' => 1, 'b' => 2], ['c' => 3, 'd' => 4]], [2, 6, 4, 8]])] + public function testConcurrent(array $input, array $output) + { + $result = []; + + foreach (Arr::concurrent(...$input) as $key => [$c, $d]) { + array_push($result, $c * 2, $d * 2); + } + + $this->assertEquals($output, $result); + } }