public static function groupBy($traversable, callable $keyFn) { self::invariant(is_array($traversable) || $traversable instanceof \Traversable, __METHOD__ . ' expects array or Traversable'); $grouped = []; foreach ($traversable as $key => $value) { $newKeys = (array) $keyFn($value, $key); foreach ($newKeys as $key) { $grouped[$key][] = $value; } } return $grouped; }