【问题标题】:PHP code to check if array is numeric is not working用于检查数组是否为数字的 PHP 代码不起作用
【发布时间】:2013-01-31 14:58:35
【问题描述】:

我有以下 PHP:

 <?php

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

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

 ?>

由于某种原因,它总是什么都不返回。我不知道我做错了什么。

谢谢

【问题讨论】:

标签: php arrays function integer numeric


【解决方案1】:

is_int 检查变量的实际类型,在您的情况下为 string。无论变量类型如何,都将is_numeric 用于数值。

请注意,以下值都被视为“数字”:

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

即任何可以有效表示浮点数或整数的浮点数、整数或字符串。

编辑:另外,您可能误解了array_filter,它不返回true 或false,而是一个包含回调函数返回true 的所有值的新数组。 if($only_integers) 仍然有效(在您修复了赋值运算符之后),因为所有非空数组都被认为是“真实的”。

编辑 2: 正如@SDC 指出的那样,如果您只想允许十进制格式的整数,则应使用ctype_digit

【讨论】:

  • 虽然您对is_int 的看法是正确的,但is_numeric 作为替代方案确实不是那么好,因为它对于许多您不一定想要的值返回true(十六进制,指数等)。您可能想改用ctype_digit()
  • 从问题中不清楚应该过滤哪些值。但是ctype_digit 是仅用于十进制格式的整数的好选择,感谢您添加它。
【解决方案2】:

您必须将原始数组的长度与过滤后的数组的长度进行比较。 array_filter 函数返回一个数组,其值与设置为 true 的过滤器匹配。

http://php.net/array_filter

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

【讨论】:

  • 这将是一个好方法,但我想知道代码有什么问题...这是我从stackoverflow.com/questions/3559542/…获得函数的链接
  • 除其他外,您错过了那里接受的答案的=== $array 部分。
  • 您的代码与该链接完全不同。链接在每个值上循环,一旦找到非数字值,就会返回 false。它比使用 array_filter 和 count 慢很多,因为循环不是在用户代码中完成的。
  • @MatthewPurdon 不是你,这是我对“这将是一个好方法但我想知道代码有什么问题[...]”的回答
【解决方案3】:
  1. is_int() 将为"1" 返回false,因为它是一个字符串。
    我看到您现在已经编辑了问题以改用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';
 }

【讨论】:

  • 这是我获得函数的链接,但我不知道我做错了什么:(stackoverflow.com/questions/3559542/…
  • @MichaelSamuel - 我可以看到你使用的代码,但你已经把它断章取义了,答案不是很有帮助。在同一答案中提供的完整功能对您来说会更好,但更重要的是,如果您要从其他人那里复制代码,请确保您花时间了解它在做什么以及为什么而不仅仅是复制+粘贴,否则你会很挣扎。
  • 这也行不通,因为如果您尝试仅更改一个值,例如 2 或 3 用一个字母,它将正确回显,因为其他 2 个值是整数
  • 不使用count()的另一个答案:有很多方法可以做同样的事情。解释他的代码:在any() 函数中,他将它与一个空数组进行比较;如果它等于一个空数组,那么我们知道所有的项目都被过滤了;它们都不匹配,因此该函数可以因此返回 false。在all() 函数中,他将其与原始输入进行比较;如果过滤后的数组和原来的不同,那么我们知道至少有一个元素被过滤了,所以函数可以返回false。
  • 我的答案不匹配:从问题中不清楚您是尝试进行 all() 类型检查还是 any() 类型检查。我的答案是any() 检查——即如果任何值都很好,它就会成功。如果您想要all(),请将count()`检查更改为if($only_integers === $array),根据另一页上的答案。
【解决方案4】:

=== 更改为 = 用于比较而不是初始化变量

<?php

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

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

?>

【讨论】:

  • +1 表示代码中最明显的错误,但这段代码仍然存在问题,会阻止它工作。
  • array_filter($array,'is_int'); 不,不是真的!浮点数被认为是一个数值以及像"34" 这样的字符串,因此作者发布的is_numeric 是正确的。
  • 更改为 is_numeric 但它仍然可以验证我是否使用字母...谢谢 :)
  • 你更好的用户 is_int 而不是 is_numberic 就像其他问题提到的那样:)
【解决方案5】:

您是否尝试在发布之前运行您的代码?我有这个错误:

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和其他工具来避免这样的错字。

【讨论】:

  • 已更改但仍无法正常工作...这是我从中获得功能的链接,但我不知道我做错了什么:(stackoverflow.com/questions/3559542/…
  • @MichaelSamuel 拿走这个文件,它对我有用。 pastebin.com/271RvL2H你的PHP是什么版本
  • 如果您将数组更改为 ("1","2","a") 例如,它仍将验证为 true :) 谢谢
【解决方案6】:
<?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';
}
?>

试试这段代码,你就会明白为什么你的代码不起作用了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 2014-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多