Breadcrumbs são simples na superfície, mas escondem um problema interessante de estrutura de dados: como navegar eficientemente de um nó folha até a raiz em uma árvore armazenada em banco relacional?

O Modelo de Dados

A tabela de páginas tem uma coluna parent_id que referencia a própria tabela — a estrutura clássica de adjacency list. Simples de inserir, mas exige cuidado na leitura.

A Função Recursiva

function buildPageAncestors(int $pageId, array &$ancestors = []): array {
    $page = $this->db->findPage($pageId);
    if (!$page) return $ancestors;
    array_unshift($ancestors, $page);
    if ($page['parent_id']) {
        return $this->buildPageAncestors($page['parent_id'], $ancestors);
    }
    return $ancestors;
}

A chave é o array_unshift — ele adiciona ao início do array, então quando a recursão termina o array já está na ordem correta: raiz → filho → neto → página atual.