在IF条件下与int和string比较

时间:2016-02-03 09:44:54

标签: php string casting compare type-conversion

PHP代码:

<?php
    $key = 0;
    if($key == 'monty' && $key == 'anil'){
        echo 'Mackraja';
    }else{
        echo "Nothing";
    }
?>

<?php
    $key = 2;
    if($key == '2abc' || $key == 'abc2'){
        echo 'Mackraja';
    }else{
        echo "Nothing";
    }
?>

输出:Mackraja

7 个答案:

答案 0 :(得分:9)

  

如果您将数字与字符串进行比较或比较涉及数字字符串,则每个字符串将转换为数字,并且数字执行比较。这些规则也适用于switch语句。 - Source

这意味着

<?php
    var_dump(0 == "a"); // 0 == 0 -> true
    var_dump("1" == "01"); // 1 == 1 -> true
    var_dump("10" == "1e1"); // 10 == 10 -> true
    var_dump(100 == "1e2"); // 100 == 100 -> true

因此,当您将$key(带值0)与字符串进行比较时,字符串的值为0,而它们都返回true 。通过这种方式,它将始终输出&#34; Mackraja&#34;。

$key的值更改为任何其他整数将返回false。

请注意

  

当比较为===!==时,不会进行类型转换,因为这涉及比较类型和值。 - Source

这意味着将比较运算符更改为===意味着值必须完全匹配 - 即字符串1 等于整数1 :他们必须匹配格式:

echo $key == 'monty' && $key == 'anil' ? 'Mackraja' : 'Nothing';
//will echo "Mackraja"

echo $key === 'monty' && $key === 'anil' ? 'Mackraja' : 'Nothing';
//will echo "Nothing"

答案 1 :(得分:3)

  

如果您将数字与字符串进行比较或比较涉及   数字字符串,然后每个字符串转换为一个数字和   比较数字化。 Reference

现在检查

<?php
$key = 0;
if($key === 'monty' && $key === 'anil'){
    echo 'Mackraja';
}else{
    echo "Nothing";
}
?>

你会得到输出“没什么”。

现在这些字符串的整数值为0,你可以在这里观察到。

<?php
$a = 'monty';
echo (int)$a; //0 

怎么样? /为什么?

把这种情况从编程中解脱出来,解释一下,如何更好地发布,我正在尝试向你解释这个概念。

如果您遇到同质性原则,则表明如果它们的尺寸不同,则无法比较两个数量。

在编程中,你无法直接比较字符串和整数,需要将其转换为任何一个进行比较。

在PHP中,如果您将阅读手册,您可以注意到或者这是PHP的基本概念: -

  

PHP不要求(或支持)变量中的显式类型定义   宣言;变量的类型由上下文决定   使用变量。

对于比较运算符,当您甚至比较两个字符串(具有松散比较)时,将它们转换为整数然后进行比较您可以在参考页面“与各种类型的比较”表中注意到它

  

所以,我可以说比较运算符本身需要整数类型变量   对于comapre,这就是为什么将两个运算符与整数进行比较的原因。

$key = 2;
if($key == '2abc' || $key == 'abc2'){
    echo '<br/>Mackraja';//outputs
}else{
    echo '<br/>nothing';//does not output
}

现在,

$key = 200;
if($key == '2a2' ){
    echo '<br/>' . $key . '== 2a2' . '&nbsp;Equal';//does not output
}else{
    echo '<br/>' . $key . '== 2a2' . '&nbsp;Not Equal'; //outputs
}

$key = 200;
if($key == '2e2' || $key == 'abc2'){
    echo '<br/>' . $key . '== 2e2' .  '&nbsp;Equal';//outputs  Now it does not convert it to integer, it converts it to 
}else{
    echo '<br/>' . $key  . '== 2e2' . "&nbsp;Not Equal";//does not output
}

现在

echo '<br/>'.'1E1'*1;  //it outputs 10 why ?? 
echo '<br/>';
echo '<br/>1E1'*1;  //it outputs 10 why ?? 

见下文: -

echo '<br/>cast to int 1E1 = ' . (int)1E1;//10
echo '<br/>Cast to int 1E2 = ' . (int)1E2;//100
//echo '<br />Cast to int 1A1 = ' . (int)1A1;//gives you error as can not be cast 
//echo '<br />Cast to int 1A2 = ' . (int)1A2;//gives you error as can not be cast
echo '<br />Cast to int 1A1 = ' . (int)('1A1');//1
echo '<br />Cast to int 1A2 = ' . (int)('1A2');//1

echo '<br/>get int value 1E1 = ' . intval('1E1');//1
echo '<br/>get int value 1E2 = ' . intval('1E2');//1
echo '<br />get int value 1A1 = ' . intval('1A1');//1
echo '<br />get int value 1A2 = ' . intval('1A2');//1
  

“这不是关于从变量获取intvalue   如何投射变量。“

我正在给你另一个干净的桌子,你已经从我之前的reference link中看到过,在比较你如何从这里注意到不同类型的变量时你会注意到这一点。

如果您需要更多资源,最好的想法是找到源代码如何编写,您可以从中学到很多东西,以及为什么他们这样做可以由PHP小组更好地解答。

如果PHP不能隐式转换这些变量,可能会遇到像这种情况无法比拟的情况,如果你希望你的PHP表现得像这样,你可以制作自己的版本。

我正在添加表格,当比较松散变量时转换是如何发生的: -

enter image description here

答案 2 :(得分:2)

检查类型转换规则以进行宽松比较(与==进行松散比较):php type conversion rules

你会看到使用松散类型比较,整数0等于任何字符串......

答案 3 :(得分:2)

  

如果您将数字与字符串进行比较或比较涉及   数字字符串,然后每个字符串转换为一个数字和   比较数字化。这些规则也适用于交换机   声明。比较时不会进行类型转换   是===或!==因为这涉及比较类型以及   当您将$ key设置为0时,将以数字方式进行比较,即(int)'monty' = 0(int)'anil' = 0

如果您想要正确的结果,请尝试此操作

$key = 0;
if($key === 'monty' && $key === 'anil'){
    echo 'Mackraja';
}else{
    echo "Nothing";
}

答案 4 :(得分:2)

如果将字符串与数字进行比较,则字符串将被转换为数字,并且检查/比较以数字方式完成

如果您仍然需要使用数据类型检查获得正确的输出,则可以使用“===”,如果如下所示将导致输出u期望为“Nothing”

<?php
  $key = 0;
  if($key === 'monty' && $key === 'anil'){
    echo 'Mackraja';
  }else{
    echo "Nothing";
  }
?>

这将输出:Nothing

答案 5 :(得分:1)

就这样做..

<?php
$key = 0;
if((string)$key == 'monty' && (string)$key == 'anil'){
    echo 'Mackraja';
}else{
    echo "Nothing";
}
?>

输出:

Nothing

答案 6 :(得分:1)

经过与同事的长时间讨论后,我们找到了解决方案

示例:

x2

说明:

  

在条件左操作数(2)与右操作数(ab2)匹配的情况下,如果   它在开头没有找到,那么输出将是假的,否则为真。

y[i,arr]

原因:

#1    var_dump("00005ab" == 5); // true
#2    var_dump("abc" == 0); // true
#3    var_dump(2 == "ab2"); // false
#4    var_dump(2 == "2ab"); // true