Ist zwar ein wenig lang, aber Funktioniert!
Eventuell könnte man es ja noch etwas einkochen!?
wie erwähnt würde ich eher zu is_numeric greifen, ctype_digit liefert zurück ob in einem string alle stellen eine dezimale ziffer sind
ctype_digit(1)
liefert false ctype_digit('1')
true
is_numeric(1)
oder is_numeric('1')
liefert true
das !empty kannst du dir ggf auch sparen, da is_nummeric ohnehin false liefert bei einem leerstring