*/ function feedfixer_group_issues( array $rows ): array { $products = array(); foreach ( $rows as $row ) { $row = (array) $row; $product_id = (int) ( $row['product_id'] ?? 0 ); if ( $product_id <= 0 ) { continue; } if ( ! isset( $products[ $product_id ] ) ) { $products[ $product_id ] = array( 'name' => '', 'issues' => array() ); } $p = &$products[ $product_id ]; if ( '' === $p['name'] ) { $p['name'] = trim( (string) ( $row['product'] ?? '' ) ); } $code = (string) ( $row['code'] ?? '' ); $severity = (string) ( $row['severity'] ?? '' ); $countries = feedfixer_split_countries( $row['applicable_countries'] ?? '' ); if ( isset( $p['issues'][ $code ] ) ) { $p['issues'][ $code ]['countries'] = array_values( array_unique( array_merge( $p['issues'][ $code ]['countries'], $countries ) ) ); if ( 'error' === $severity ) { $p['issues'][ $code ]['severity'] = 'error'; } } else { $p['issues'][ $code ] = array( 'severity' => $severity, 'code' => $code, 'explanation' => feedfixer_explain_issue( $row ), 'countries' => $countries, ); } unset( $p ); } $groups = array(); foreach ( $products as $product_id => $p ) { $issues = array_values( $p['issues'] ); foreach ( $issues as $i => $issue ) { $issues[ $i ]['countries'] = implode( ', ', $issue['countries'] ); } // Stable sort (PHP 8): errors first, otherwise keep input order. usort( $issues, fn ( $a, $b ) => ( 'error' === $b['severity'] ) <=> ( 'error' === $a['severity'] ) ); $groups[] = array( 'product_id' => $product_id, 'product_name' => '' !== $p['name'] ? $p['name'] : 'Product #' . $product_id, 'issues' => $issues, ); } $errors = fn ( array $g ): int => count( array_filter( $g['issues'], fn ( $i ) => 'error' === $i['severity'] ) ); usort( $groups, fn ( $a, $b ) => array( $errors( $b ), count( $b['issues'] ), $a['product_id'] ) <=> array( $errors( $a ), count( $a['issues'] ), $b['product_id'] ) ); return $groups; } /** * Totals for a list of groups. * * @return array{products:int, issues:int, errors:int} */ function feedfixer_issue_counts( array $groups ): array { $counts = array( 'products' => count( $groups ), 'issues' => 0, 'errors' => 0 ); foreach ( $groups as $group ) { foreach ( $group['issues'] as $issue ) { $counts['issues']++; if ( 'error' === $issue['severity'] ) { $counts['errors']++; } } } return $counts; }