奇怪的PHP字符串整数比较和转换

Posted

技术标签:

【中文标题】奇怪的PHP字符串整数比较和转换【英文标题】:Weird PHP String Integer Comparison and Conversion 【发布时间】:2012-03-04 16:30:01 【问题描述】:

当我遇到以下情况时,我正在处理一些数据解析代码。

$line = "100 something is amazingly cool";
$key = 100;

var_dump($line == $key);

好吧,我们大多数人都希望转储生成false,但令我惊讶的是,转储是true

我知道在 php 中有这样的类型转换:

$x = 5 + "10 is a cool number"; // as documented on PHP manual
var_dump($x); // int(15) as documented.

但是为什么像我在第一个示例中提到的比较将我的字符串转换为整数而不是将整数转换为字符串。

我知道您可以对我的示例进行=== strict-comparison,但我只想知道:

PHP 文档中是否有任何部分提及此行为? 谁能解释为什么会发生在 PHP 中? 程序员如何防止此类问题发生?

【问题讨论】:

我认为 == 会进行数值比较,并且当您使用字符串并将其转换为以数字开头的数字时,它会使用该数字。如果它可能不会返回类似 NaN 的东西。 我们大多数人都期望这个....当将字符串转换为整数时(就像将字符串与数字进行比较时发生的那样),PHP 会在遇到的第一个非数字数字处停止,在在这种情况下,100(所有数字)和“某物”之间的空格。 SO 100 是结果值。 见***.com/a/8672423 php.net/manual/en/language.operators.comparison.php @mark 是的,我们大多数人都希望在执行算术运算时进行转换,但在比较中呢? 【参考方案1】:

如果我正确地回忆 PHP 将这两个变量“强制转换”为可能的最低类型。 他们称之为类型杂耍。

试试:var_dump("something" == 0); 例如,那会给你 true 。 .以前被我咬过一次。

更多信息:http://php.net/manual/en/language.operators.comparison.php

【讨论】:

PHP 手册现在在php.net/manual/en/language.types.type-juggling.php 描述了类型杂耍,这又在php.net/manual/en/… 链接到关于字符串转换为数字的部分【参考方案2】:

我知道这已被回答并接受,但我想添加一些内容,以帮助其他通过搜索找到此内容的人。

当我比较 post 数组与 PHP 数组中的键时,我遇到了同样的问题,在我的 post 数组中,我有一个额外的字符串值。

$_POST["bar"] = array("other");

$foo = array(array("name"=>"foobar"));

foreach($foo as $key=>$data)
    $foo[$key]["bar"]="0";
    foreach($_POST["bar"] as $bar)
        if($bar==$key)
            $foo[$key]["bar"]="1";
        
    

据此,您会认为最后$foo[0]["bar"] 将等于"0",但是当$key = int 0$bar = string "other" 进行松散比较时,结果是true 来解决这个问题,我严格比较,但是当 POST 数组定义为 array("other","0"); 时,需要将 $key = int 0 转换为 $key = string "0" 以下工作:

$_POST["bar"] = array("other");

$foo = array(array("name"=>"foobar"));

foreach($foo as $key=>$data)
    $foo[$key]["bar"]="0";
    foreach($_POST["bar"] as $bar)
        if($bar==="$key")
            $foo[$key]["bar"]="1";
        
    

如果"0" 在 POST 条形数组中,则结果为 $foo[0]["bar"]="1";如果 "0" 不在 POST 条形数组中,则结果为 $foo[0]["bar"]="0"

请记住,在比较变量时,由于 PHP 的变量类型松散,您的变量可能不会像您想象的那样进行比较。

【讨论】:

也许只有我一个人,但你的例子太复杂了。问题似乎是您将$foo 定义为嵌套在常规数组中的关联数组,然后使用关联数组表达式($key=>$data) 来解析常规数组。如果您必须在数据中进行这种嵌套,为什么不将该循环嵌套在另一个可以处理常规数组的循环中?

以上是关于奇怪的PHP字符串整数比较和转换的主要内容,如果未能解决你的问题,请参考以下文章

C++ 将字符串转换为整数;得到奇怪的输出?

php中的字符串比较奇怪的行为

PHP数据类型转换和运算符表达式

奇怪的错误,将字符与字符串进行比较(p == "cancel")

[PHP] 算法-将一个字符串转换成一个整数的PHP实现

php数值转换函数