<?php

// https://pt.stackoverflow.com/q/355941/5878

$gabarito = '1;1;A|2;1;B|3;1;C|4;1;A|5;1;A|6;2;D|7;2;C|8;2;B|9;2;A|10;2;A';

$materias = [];

foreach (explode('|', $gabarito) as $resposta) {
    list($pergunta, $materia, $alternativa) = str_getcsv($resposta, ';');
    
    if ( ! array_key_exists($materia, $materias)) {
        $materias[$materia] = [];
    }

    $materias[$materia][] = compact('pergunta', 'alternativa');
}

echo json_encode($materias, JSON_PRETTY_PRINT);