public static function assertCollection($collection, $callee, $parameterPosition) { self::assertCollectionAlike($collection, 'Traversable', $callee, $parameterPosition); }
/** * Recombines arrays by index (column) and applies a callback optionally * * When the input collections are different lengths the resulting collections * will all have the length which is required to fit all the keys * * @param $args array|Traversable $collection One or more callbacks * @return array */ function zip_all(...$args) { /** @var callable|null $callback */ $callback = null; if (is_callable(end($args))) { $callback = array_pop($args); } foreach ($args as $position => $arg) { InvalidArgumentException::assertCollection($arg, __FUNCTION__, $position + 1); } $resultKeys = []; foreach ($args as $arg) { foreach ($arg as $index => $value) { $resultKeys[] = $index; } } $resultKeys = array_unique($resultKeys); $result = []; foreach ($resultKeys as $key) { $zipped = []; foreach ($args as $arg) { $zipped[] = isset($arg[$key]) ? $arg[$key] : null; } $result[$key] = $zipped; } if ($callback !== null) { foreach ($result as $key => $column) { $result[$key] = $callback(...$column); } } return $result; }