2013-02-15 103 views
-1

我有以下PHP:PHP代碼,如果數組是數字無法正常工作

<?php 

$array = array("1","2","3"); 
$only_integers === array_filter($array,'is_numeric'); // true 

if($only_integers == TRUE) 
{ 
echo 'right'; 
} 

?> 

出於某種原因,一直沒有返回。我不知道我做錯了什麼。

由於

+8

===應改爲= – 2013-02-15 15:37:37

+0

這是我得到的鏈接函數從但我不知道我在做什麼錯誤:(http://stackoverflow.com/questions/3559542/more-concise-way-to-check-to-see-if-an-array-contains -only-numbers-integers – 2013-02-15 15:46:26

回答

2
is_int

檢查的實際類型的變量,它是你的情況string的。無論變量類型如何,都使用is_numeric作爲數值。

請注意,下列值都被認爲是「數字」:

"1" 
1 
1.5 
"1.5" 
"0xf" 
"1e4" 

即任何浮動,整數或字符串,這將是浮動或整數的有效表示。此外,您可能誤解了array_filter,它不返回true或false,而是返回true的所有值的新數組。 if($only_integers)仍然有效(因爲您修改了賦值運算符後),因爲所有非空數組都被視爲「true-ish」。

編輯2:爲@SDC指出,你應該使用ctype_digit,如果你只想用十進制格式整數。

+1

雖然你對「is_int」正確,但是「is_numeric」確實不是很好的選擇,因爲它對許多你不一定想要的值返回true(hex,exponents等等)。你可能想用'ct ype_digit()'代替。 – SDC 2013-02-15 15:39:54

+0

從問題中不清楚哪些值應該過濾。但'ctype_digit'對於只有十進制格式的整數是一個很好的選擇,謝謝添加它。 – 2013-02-15 15:44:52

-1
<?php 
$test1 = "1"; 
if (is_int($test1) == TRUE) { 
    echo '$test1 is an integer'; 
} 
$test2 = 1; 
if (is_int($test2) == TRUE) { 
    echo '$test2 is an integer'; 
} 
?> 

試試這段代碼,你就會明白爲什麼你的代碼不起作用。

+0

已經更改爲is_numeric,但它仍然無法正常工作....感謝:) – 2013-02-15 15:42:39

0

變化====它用來比不上用於初始化可變

<?php 

$array = array(1,2,3); 
$only_integers = array_filter($array,'is_int'); // true 

if($only_integers == TRUE) 
{ 
echo 'right'; 
} 

?> 
+0

對於代碼中最明顯的錯誤,但仍然存在問題,這將阻止它的工作。 – SDC 2013-02-15 15:42:18

+0

'array_filter($ array,'is_int');'不,不是真的!一個float被認爲是一個數字值和一個像「34」這樣的字符串,因此作者發佈的is_numeric是正確的。 – Shoe 2013-02-15 15:42:35

+0

改爲is_numeric,但它仍然驗證,如果我使用字母......謝謝:) – 2013-02-15 15:43:32

2

你必須原始陣列的長度比較濾波的陣列的長度。 array_filter函數返回一個數組,其值與過濾器設置爲true相匹配。

http://php.net/array_filter

if(count($only_integers) == count($array)) { 
    echo 'right'; 
} else { 
    echo 'wrong'; 
} 
+0

這將是一個很好的方法,但我想知道代碼有什麼問題...這是鏈接我從http://stackoverflow.com/questions/3559542/more-concise-way-to-check-to-see-if-an-array-contains -only-numbers-integers – 2013-02-15 15:47:24

+0

除其他外,您錯過了接受答案的'=== $ array'部分。 – 2013-02-15 15:50:42

+0

您的代碼與該鏈接完全不一樣。該鏈接正在循環遍歷每個值,並且只要它發現非數字值就返回false。這比使用array_filter慢很多,因爲循環沒有在userland代碼中完成。 – 2013-02-15 15:51:19

0

你嘗試發佈前運行代碼?我有這樣的錯誤:

Notice: Undefined variable: only_integers in ~/php/test.php on line 4 
Notice: Undefined variable: only_integers in ~/php/test.php on line 6 

變化====修復這個問題的時候了。你最好學習如何使用phplint和其他工具來避免這樣的錯字錯誤。

+0

改變了它,但仍然無法正常工作......這是我得到的鏈接函數從但我不知道我在做什麼錯誤:(http://stackoverflow.com/questions/3559542/more-concise-way-to-check-to-see-if-an-array-contains -only-numbers-integers – 2013-02-15 15:53:28

+0

@MichaelSamuel取這個文件,它適用於我 http://pastebin.com/271RvL2H 如果你將數組改爲(「1」,「」),你的PHP – nXqd 2013-02-16 10:32:19

+0

的版本是什麼, 2「,」a「)例如它仍然驗證爲真:)謝謝 – 2013-02-16 23:22:08

1
  1. is_int()將返回false"1",因爲它是一個字符串。
    我看到您現在編輯的問題是使用is_numeric()代替;這也可能是一個糟糕的主意,因爲它會返回true作爲十六進制和指數值,您可能不想(例如is_numeric("dead")將返回true)。
    我建議改用ctype_digit()

  2. 三重平等被濫用在這裏。它用於比較,而不是任務,所以$only_integers將永遠不會被設置。使用單等於設置$only_integers

  3. array_filter()不返回true/false值;它將返回數組,並刪除已過濾的值。這意味着後續檢查$only_integers是真實的將不起作用。

  4. $only_integers == TRUE。這沒關係,但你可能應該在這裏使用三重平等。但是當然,我們已經知道$only_integers不會是truefalse,它將是一個數組,所以實際上我們需要檢查它是否有任何元素。 count()會在這裏做詭計。

這裏是你的代碼是什麼樣子,考慮所有的考慮......因爲你要分配結果

$array = array("1","2","3"); 
$only_integers = array_filter($array,'ctype_digit'); // true 

if(count($only_integers) > 0) 
{ 
    echo 'right'; 
} 
+0

這是我從中得到的功能鏈接,但我不知道我在做什麼錯誤:(http://stackoverflow.com/問題/ 3559542 /更簡潔的路到校驗 - 見-IF-AN-陣列包含只-N umbers-integers – 2013-02-15 15:53:06

+0

@MichaelSamuel - 我可以看到你所採用的代碼,但是你已經將它置於了上下文之外,而且答案並不是非常有用。在同樣的答案中提供的完整功能對您來說更好,但更重要的是,如果您要從其他人那裏獲取代碼,請確保您花時間瞭解它在做什麼以及爲什麼而不是僅僅複製+粘貼,否則你會非常掙扎。 – SDC 2013-02-15 15:57:30

+0

這也不起作用,因爲如果你試圖只用一個字母改變一個像2或3這樣的值,它會回顯正確,因爲其他2個值是整數 – 2013-02-15 16:00:53