【问题标题】:Compare with int and string in IF condition与 IF 条件下的 int 和 string 比较
【发布时间】:2016-02-03 09:44:54
【问题描述】:

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

【问题讨论】:

  • 为什么要使用&amp;&amp;?一个属性不能同时得到两个不同的值!使用||
  • 不代表我们使用的是哪个运算符 ||或 && 它给出相同的输出
  • 合乎逻辑,不正确,与语法无关
  • 是的,我在逻辑上认为它不是真的,但它是如何在真实条件下出现的@MohsenShakibafar
  • 因为类型。类型差异 0 是 integer ,如果你输入 '0' 你会看到它工作正常。见stackoverflow.com/questions/523643/…

标签: php string casting compare type-conversion


【解决方案1】:

如果您将数字与字符串进行比较,或者比较涉及数字字符串,则每个字符串都将转换为数字并以数字方式执行比较。这些规则也适用于 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。这样,它总是会输出“Mackraja”。

将$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"

【讨论】:

  • 当我们这样做时:---> echo $key == 'monty' && $key == 'anil' ? 'Macraja'; '没有'; //将回显“Mackraja”:-> 它不会给你任何东西而不是 Mackraja echo $key === 'monty' && $key === 'anil' ? 'Macraja'; '没有'; //将回显“Nothing”
  • 你的回答让我不满意
  • @Monty 抱歉,我的 if/else 语句中有语法错误。立即尝试。
  • 看我的回答:@Ben
【解决方案2】:

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

现在检查

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

你会得到输出“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

“这不是关于从变量中获取整数值,而是关于 如何转换变量。”

我给你另一个干净的表,你已经从我之前的reference link 中看到过,比较不同类型的变量在 PHP 中是如何转换的,你可以从这里注意到。

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

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

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

【讨论】:

  • 我想知道原因,我知道该怎么做。对你的回答不满意
  • @Monty 我已经编辑了我的答案,希望这次我能给你更好的主意。
  • @Monty 我已经添加了更多解释和更多示例,您可以在其中注意到 PHP 的不同条件和行为。
  • :您在答案中写的参考链接给我留下了深刻的印象。你有没有看我的答案,你认为它是否接近真实答案
  • @Monty 现在要阅读其他答案,我现在还没有阅读任何其他答案。
【解决方案3】:

检查松散比较的类型转换规则(Loose comparisons with ==):php type conversion rules

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

【讨论】:

    【解决方案4】:

    如果您将数字与字符串进行比较,或者比较涉及 数字字符串,然后将每个字符串转换为数字,然后 数值进行比较。这些规则也适用于交换机 陈述。比较时不发生类型转换 是 === 或 !== 因为这涉及比较类型以及 值。当您将 $key 提供为 0 时,将以数字形式进行比较,即 (int)'monty' = 0 和 (int)'anil' = 0。

    如果你想要正确的结果试试这个

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

    【讨论】:

    • 我知道,我想要怎么做(什么是原因)
    【解决方案5】:

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

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

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

    这将输出:Nothing

    【讨论】:

    • 我想知道原因,我知道该怎么做。对您的回答不满意。
    【解决方案6】:

    就这样吧..

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

    输出:

    Nothing
    

    【讨论】:

    • 我知道,最好的选择是像这样比较类型:=== 但我的问题是如何可能
    • 因为你试图比较整数和字符串
    【解决方案7】:

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

    示例:

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

    说明:

    在条件左操作数 (2) 与右操作数 (ab2) 匹配时,如果 一开始没有找到,则输出为假,否则为真。

    #1 : we found 5 at the begining output will be true. 0 will be eliminated.
    #2 : string + int = int output will be true. 
         Priority of int is higher, 0 == 0 output will be true,
    #3 : 2 is not found at the beginning of match value (ab2), output will be false.
    #4 : 2 is found at the beginning of match value (2ab), output will be true.
    

    原因:

    1.) In PHP, its automatically convert Type Casting.
    2.) Rules of Type Casting : 
        2.1) int + int = int
        2.2) string + string = string
        2.3) float + float = double
        2.4) int + string = int     
        2.5) float + string = double
        2.6) int + float = double
    

    【讨论】:

      猜你喜欢
      • 2021-01-18
      • 2014-09-21
      • 1970-01-01
      • 2012-04-18
      • 2012-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多