2012-10-12 66 views
2

我通過POST獲取輸入值,其中一些可能是ID指的是其他的東西,一些從0開始。當選擇ID爲0的東西或沒有值的東西時,是否有像intval()這樣的方法返回更有用的東西比0無法解析?或者我可以以某種方式區分intval()的結果與解析失敗的結果?在PHP中,我可以從intval(「0」)中區分intval(null)的結果嗎?

例子:

echo intval(null); // 0 
echo intval("0"); // 0 
+5

如何測試它們*之前*你將它們轉換爲不能爲空或字符串的值? :P表達式'null!== 0','「0」!== 0'和'「0」!== null'都是真的。 – cHao

+1

一個簡單的'if($ val === null)'是你在這裏需要的。 – Jon

+0

您可以使用PHP gettype函數。並比較它的NULL或INTEGER。如果引用將會是字符串。 http://php.net/manual/en/function.gettype.php – Dev

回答

6

可以使用filter_var()函數來確定的區別:

filter_var(null, FILTER_VALIDATE_INT); 
// false 

filter_var('0', FILTER_VALIDATE_INT); 
// int(0) 

您還可以添加標誌,專門接受十六進制和八進制值,但我不會推薦爲你的情況。

順便說一下,在這個變量來自$_POST更可能的情況下,你也可以使用filter_input()

if (is_int($nr = filter_input(INPUT_POST, 'nr', FILTER_VALIDATE_INT))) { 
    // $nr contains an integer 
} 

的原因,我對filter_input結果使用is_int()是因爲當沒有張貼,返回null;使用is_int()來防範這個問題。

編輯

如果問題真的只是null VS '0'你可以比較$var !== null

if (!is_null($var)) { 
    // $var is definitely not null 
    // but it might also be an object, string, integer, float even, etc. 
} 
+0

要注意它使用了過濾器擴展(自PHP 5.2以來包含在php基本擴展中) –

+0

當然,這並不能真正解決任何問題,因爲你現在必須區分'0'和'false' ... :) – Jon

+1

is_int('0')爲假。 is_int(0)是真的。看到http://ideone.com/3XKKP –

0

你可以先檢查其數字:

is_numeric($val); 
+0

但不是int,所有數字(float也是) –

+0

但是如果它是一個數字並且intval返回0,那麼您將知道該值爲0.如果它不是數字並且intval返回0,那麼您將知道它不是0 (如null) – Nin

-2

好的,現在去找解決方案。

preg_match('/^\d+$/','0') //is true 

preg_match('/^\d+$/',NULL) //is false 
+0

這與'is_numeric($ value)'完全等價。 'is_int(intval(anything))'是無用的,因爲它永遠是真的;你什麼時候轉換爲int而不是int? – cHao

+0

@cHao:請先測試代碼:)還有一件事情,如果第一個條件爲false,那麼下一個表達式不會被評估。 PHP文檔說 –

+0

我不在乎它是否有效。我的觀點是,你正在做無用的測試。你首先測試它,不管是否包含&&,並且看看在這兩種情況下你是否得到了完全相同的結果。 – cHao