PHP Conference Japan 2024

is_int

(PHP 4, PHP 5, PHP 7, PHP 8)

is_int判斷變數的類型是否為整數

說明

is_int(mixed $value): bool

判斷給定變數的類型是否為整數。

注意:

要測試變數是否為數字或數字字串(例如表單輸入,它始終是字串),您必須使用 is_numeric()

參數

value

要評估的變數。

回傳值

如果 value 是一個 整數 (int),則回傳 true,否則回傳 false

範例

範例 #1 is_int() 範例

<?php
$values
= array(23, "23", 23.5, "23.5", null, true, false);
foreach (
$values as $value) {
echo
"is_int(";
var_export($value);
echo
") = ";
var_dump(is_int($value));
}
?>

上述範例會輸出:

is_int(23) = bool(true)
is_int('23') = bool(false)
is_int(23.5) = bool(false)
is_int('23.5') = bool(false)
is_int(NULL) = bool(false)
is_int(true) = bool(false)
is_int(false) = bool(false)

另請參閱

新增註解

使用者貢獻的註解 11 則註解

Simon Neaves
16 年前
我發現 is_int 和 ctype_digit 的行為都不太符合我的預期,所以我寫了一個叫做 isInteger 的簡單函式來達成我的目的。希望有人覺得它有用。

<?php
function isInteger($input){
return(
ctype_digit(strval($input)));
}

var_dump(is_int(23)); //bool(true) // 布林值(真)
var_dump(is_int("23")); //bool(false) // 布林值(假)
var_dump(is_int(23.5)); //bool(false) // 布林值(假)
var_dump(is_int(NULL)); //bool(false) // 布林值(假)
var_dump(is_int("")); //bool(false) // 布林值(假)

var_dump(ctype_digit(23)); //bool(true) // 布林值(真)
var_dump(ctype_digit("23")); //bool(false) // 布林值(假)
var_dump(ctype_digit(23.5)); //bool(false) // 布林值(假)
var_dump(ctype_digit(NULL)); //bool(false) // 布林值(假)
var_dump(ctype_digit("")); //bool(true) // 布林值(真)

var_dump(isInteger(23)); //bool(true) // 布林值(真)
var_dump(isInteger("23")); //bool(true) // 布林值(真)
var_dump(isInteger(23.5)); //bool(false) // 布林值(假)
var_dump(isInteger(NULL)); //bool(false) // 布林值(假)
var_dump(isInteger("")); //bool(false) // 布林值(假)
?>
Robin
14 年前
請記住,is_int() 的運算是以有號方式進行,而不是無號,並且受 PHP 運行環境的字組大小限制。

在 32 位元環境中

<?php
is_int
( 2147483647 ); // true // 真
is_int( 2147483648 ); // false // 假
is_int( 9223372036854775807 ); // false // 假
is_int( 9223372036854775808 ); // false // 假
?>

在 64 位元環境中

<?php
is_int
( 2147483647 ); // true
is_int( 2147483648 ); // true
is_int( 9223372036854775807 ); // true
is_int( 9223372036854775808 ); // false
?>

如果您在 32 位元的環境中需要確認數值是否為整數(而且只能是整數),而這些數值可能超出 32 位元的範圍,您可以結合 is_int() 和 is_float() 來確保涵蓋完整的、有號的 64 位元範圍。

<?php
$small
= 2147483647; // is_int() 永遠會傳回 true,但 is_float() 永遠不會
$big = 9223372036854775807; // 只有在 64 位元環境中,is_int() 才會傳回 true

if( is_int($small) || is_float($small) ); // 在 32 位元環境中會通過
if( is_int($big) || is_float($big) ); // 在 32 位元環境中會通過
?>
e dot sand at elisand dot com
15 年前
Simon Neaves 幾乎解釋了為什麼他的函式是測試整數的完美選擇(可能是大多數人需要的)。不過,他在 ctype_digit() 的輸出上犯了一些錯誤 - 可能是打字錯誤,或者可能是他當時使用的 PHP 版本中的錯誤。

他的部分範例的正確輸出應該是

<?php
var_dump
(ctype_digit(23)); //bool(false)
var_dump(ctype_digit("23")); //bool(true)
var_dump(ctype_digit(23.5)); //bool(false)
var_dump(ctype_digit(NULL)); //bool(false)
var_dump(ctype_digit("")); //bool(false)
?>

如您所見,僅使用 ctype_digit() 可能並非總是有效的原因是,它只在輸入為字串時傳回 TRUE - 輸入數值時則傳回 FALSE(這可能與預期不符)。
andre dot roesti at 7flex dot net
14 年前
使用這個函式,您可以檢查多個變數是否都是整數。這比為每個變數都寫 'is_int' 稍微方便一些。

<?php
函式 are_int ( ) {
$args = func_get_args ();
foreach (
$args as $arg )
if ( !
is_int ( $arg ) )
return
false;
return
true;
}

// 範例:
are_int ( 4, 9 ); // true
are_int ( 22, 08, 'foo' ); // false
?>
Hector (hector-ordonez.com)
8 年前
Simon Neaves 的答案並不完整:負整數會回傳 false。

我建議參考 Stack Overflow 的答案
http://stackoverflow.com/questions/6416763/checking-if-a-variable-is-an-integer-in-php
davide dot renzi at gmail dot com
8 年前
我找到一個更快判斷是否為整數的方法。
在我的環境中,這個方法的速度大約是使用 is_int() 的一半。

將值強制轉換為整數,然後檢查它是否與原始值相同。

<?php
if ( (int) $n !== $n ) {
echo
'不是整數';
} else {
echo
'是整數';
}
?>
petepostma at gmail dot spam dot com
12 年前
這種僅檢查整數類型的檢查方式有個反面教材。

is_int( $integer_type) 只會在類型是 int 時回傳 true,而不是檢查值
ctype_digit( $string_type) 只會在類型是字串,且其值為整數時回傳 true

因此
return ( is_int($value) || ctype_digit($value) );
nicolas dot giraud at actiane dot com
12 年前
這是一個更簡潔的方法,用於檢查變數是否為整數,或是一個只包含 0 到 9 數字的字串。

<?php
$bool
= ( !is_int($value) ? (ctype_digit($value)) : true );

$value = 42; //true(真)
$value = '42'; //true(真)
$value = '1e9'; //false(假)
$value = '0155'; //true(真)
$value = 0155; //true(真)
$value = 0xFF; //true(真),因為它等同於 255
$value = '0xFF'; //false(假)
$value = 'a'; //false(假)
$value = array(); //false(假)
$value = array('5'); //false(假)
$value = array(5); false(假)
$value
= ''; //false(假)
$value = NULL; //false(假)

?>

簡潔又酷 :)
Vasiliy Makogon
8 年前
如果您想要偵測以純整數或浮點數表示,以及以字串值表示的整數或浮點數值,請使用這些函式。

<?php
函式 isInteger($val)
{
如果 (!
is_scalar($val) || is_bool($val)) {
返回
false;
}
如果 (
is_float($val + 0) && ($val + 0) > PHP_INT_MAX) {
返回
false;
}
返回
is_float($val) ? false : preg_match('~^((:?+|-)?[0-9]+)$~', $val);
}

函式
isFloat($val)
{
如果 (!
is_scalar($val)) {
返回
false;
}
返回
is_float($val + 0);
}

foreach ([
'11111111111111111', 11111111111111111, // > PHP_INT_MAX - 在 PHP 中呈現為浮點數
1, '10', '+1', '1.1', 1.1, .2, 2., '.2', '2.',
'-2.', '-.2', null, [], true, false, 'string'
] as $value) {
顯示
$value . ':' . gettype($value) . ' 是整數嗎? - ' . (isInteger($value) ? '是' : '否') . PHP_EOL;
顯示
$value . ':' . gettype($value) . ' 是浮點數嗎? - ' . (isFloat($value) ? '是' : '否') . PHP_EOL;
}
?>
me at rexxars dot com
15 年前
我正在尋找檢查無符號整數最快的方法,它能支援像 4318943448871348 或 0xFFFFFFFF 這樣的大數字。

我想到的最快方法是這個
<?php
function is_unsigned_int($val) {
return
ctype_digit((string) $value));
}
?>

會在 1515、0xFFFFFFFF、「3515」和「1365158185855141」時回傳 true。
會在 0.1515、「415.4134」和「-616」時回傳 false。

但要注意,在 PHP 5.1.0 之前,空字串會回傳 true。

根據我的基準測試,這比正規表達式 ^\d+$ 快約 30%。
gabe at websaviour dot com
21 年前
雖然這可以從文件中推斷出來,但要注意數字字串。我在一個 MySQL 應用程式中遇到了這個問題,我要嘛 `SELECT` 一個 `INT` 主鍵,要嘛 `INSERT` 一個新記錄,然後使用 `mysql_insert_id()` 取得鍵值,再繼續到新的區段。

我使用 `is_int()` 來確保後續的查詢在使用鍵值變數時不會出錯。不幸的是,我沒有意識到,雖然 `mysql_insert_id()` 會回傳一個整數,但 `mysql_result()` 總是會回傳一個字串,即使您是從 `INT` 欄位 `SELECT` 資料也是如此。

我花了至少 30 分鐘試圖找出為什麼現有的記錄沒有被連結,但新的記錄卻可以正常連結。最後,我在 `mysql_result()` 上使用了 `intval()` 來確保後續的查詢仍然可以正常運作。
To Top