Non e' che una funzione sia meglio dell'altra, dipende come sempre da caso a caso. Ognuna delle due funzioni ha il suo scopo.

Ad esempio se, come sopra, ti arrivano dei dati da un form html, e tu vuoi controllare che ci siano solo cifre per la query, usi ctype_digit, perche' questa funzione accetta stringhe (e i dati dal html anche se sono interi arrivano sotto forma di stringa), e controlla effettivamente che ci siano solo cifre.

is_numeric invece controlla che un dato sia un numero, e il concetto di numero e' piu' ampio del concetto "solo cifre". Ad esempio i seguenti sono tutti numeri: 2e5, 0xff, -1.9.

Quindi devi usare is_numeric se ti aspetti dei numeri in qualsiasi forma e di qualsiasi tipo (ad es. per operazioni aritmetiche), e devi usare ctype_digit se vuoi controllare una cosa come sopra, cioe' che il dato contenga solo cifre, devi usare is_int se vuoi solo dati di tipo intero positivi e negativi, devi usare is_float per quelli in virgola mobile, e cosi via.