> $rows * @return array{upcoming: list>, past: list>} */ public static function partition( array $rows, string $now ): array { $upcoming = []; $past = []; foreach ( $rows as $row ) { $start = Val::string( $row['start_dt'] ?? '' ); if ( '' !== $start && $start >= $now ) { $upcoming[] = $row; } else { $past[] = $row; } } usort( $upcoming, static fn( array $a, array $b ): int => strcmp( Val::string( $a['start_dt'] ?? '' ), Val::string( $b['start_dt'] ?? '' ) ) ); usort( $past, static fn( array $a, array $b ): int => strcmp( Val::string( $b['start_dt'] ?? '' ), Val::string( $a['start_dt'] ?? '' ) ) ); return [ 'upcoming' => $upcoming, 'past' => $past, ]; } }