I suppose one could try something like this: if (is_string($val) && $val === (string)(int)$val) .... If $val is an integer masquerading as a string, it should be identical to the original string when cast back to a string, shouldn't it? (I can't try it right now.) Andrew