, totals: array, added: string[], removed: string[]} */ public static function compare( array $a, array $b ): array { $dims = array( 'php_ms', 'queries', 'query_ms', 'assets_kb', 'autoload_kb', 'cron_per_day', 'weight' ); $oa = (array) ( $a['owners'] ?? array() ); $ob = (array) ( $b['owners'] ?? array() ); $owners = array(); foreach ( array_unique( array_merge( array_keys( $oa ), array_keys( $ob ) ) ) as $key ) { $row = array( 'key' => $key, 'name' => (string) ( $ob[ $key ]['name'] ?? $oa[ $key ]['name'] ?? $key ), ); foreach ( $dims as $d ) { $before = (float) ( $oa[ $key ][ $d ] ?? 0 ); $after = (float) ( $ob[ $key ][ $d ] ?? 0 ); $row[ $d ] = array( 'before' => $before, 'after' => $after, 'delta' => round( $after - $before, 2 ), 'pct' => $before > 0 ? round( ( $after - $before ) / $before * 100, 1 ) : ( $after > 0 ? 100.0 : 0.0 ), ); } $owners[ $key ] = $row; } uasort( $owners, static function ( $x, $y ) { return abs( $y['php_ms']['delta'] ) <=> abs( $x['php_ms']['delta'] ); } ); $totals = array(); foreach ( array( 'frontend_ms', 'admin_ms', 'queries' ) as $t ) { $before = (float) ( $a['totals'][ $t ] ?? 0 ); $after = (float) ( $b['totals'][ $t ] ?? 0 ); $totals[ $t ] = array( 'before' => $before, 'after' => $after, 'delta' => round( $after - $before, 2 ), 'pct' => $before > 0 ? round( ( $after - $before ) / $before * 100, 1 ) : 0.0, ); } return array( 'owners' => $owners, 'totals' => $totals, 'added' => array_values( array_diff( array_keys( $ob ), array_keys( $oa ) ) ), 'removed' => array_values( array_diff( array_keys( $oa ), array_keys( $ob ) ) ), ); } }