Em defesa do PHP (risos)
O preg_match ou preg_match_all retorna a quantidade de matches, que daria para usar num while(), por exemplo, e rodaria até não encontrar mais resultados.
Já a criação dos arrays no preg_match_all, segue a ideia das backreferences, aonde o indice 0 é sempre o match completo, o indice 1 é o resultado do grupo 1 e o indice N é o resultado do grupo N. E dentro dessa posição, vem os valores dos matchs em ordem de matches. E em cada posição, pode vir o valor OU um array com o valor e indice de onde este valor foi encontrado na string alvo.