<?php
$a = 3.3;
if (floor($a) == $a) {
echo "$a 是整數";
} else {
echo "$a 不是整數"; // 輸出此行
}
?>
原理:整數取整後與原值相等。同理可用 ceil()、round()、intval()。但**僅適用於數值型別**,字串 "3.0" 會被隱性轉換為 float 3.0 而判定為整數。
<?php
$a = 3.3;
if (is_int($a)) {
echo "$a 是整數";
} else {
echo "$a 不是整數"; // 輸出此行
}
?>
核心差異:is_int() 檢查**變數型別**而非數值內容。is_int(3) → true;is_int(3.0) → false(float);is_int("3") → false(string)。
表單輸入、API 參數皆為字串,直接用 is_int() 會誤判。解決方案:
function str_is_int_regex($str) {
return preg_match('/^-?\d+$/', $str) === 1;
}
function str_is_int_cast($str) {
return 0 === strcmp($str, (string)(int)$str);
}
// 或更簡潔(PHP 7+)
function str_is_int_simple($str) {
return filter_var($str, FILTER_VALIDATE_INT) !== false;
}
ctype_digit("123"); // true
ctype_digit("-123"); // false
ctype_digit("12.3"); // false
| 方法 | 適用型別 | 負數支援 | 效能 | 建議場景 |
|---|---|---|---|---|
| is_int() | 僅 integer | 是 | 極快 | 內部變數型別檢查 |
| floor() == | 數值型 | 是 | 快 | 數學運算後驗證 |
| filter_var() | 字串/數值 | 是 | 中 | 外部輸入驗證(表單、API) |
| 正則 | 字串 | 可控 | 較慢 | 複雜格式驗證 |
| ctype_digit | 字串 | 否 | 極快 | 非負整數純字串檢查 |
is_int() 或 === 嚴格比較。filter_var($input, FILTER_VALIDATE_INT),可同時過濾、轉換、驗證。PDO::PARAM_INT,讓驅動層處理型別。magic_quotes_gpc、開啟 strict_types=1,在邊界處顯式驗證與轉型。判斷整數看似簡單,實則涉及型別系統、隱性轉換、外部輸入邊界等核心概念。選對工具、守住邊界,才能寫出健壯的 PHP 程式碼。