Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中键入杂耍和(严格)大于/小于比较_Php_If Statement_Comparison_Logic_Ieee 754_Ieee754 - Fatal编程技术网

在PHP中键入杂耍和(严格)大于/小于比较

在PHP中键入杂耍和(严格)大于/小于比较,php,if-statement,comparison,logic,ieee-754,ieee754,Php,If Statement,Comparison,Logic,Ieee 754,Ieee754,PHP以其类型转换而闻名。我必须承认这让我困惑,我很难在比较中找出基本的逻辑/基本的东西 例如:如果$a>$b为真且$b>$c为真,这是否意味着$a>$c也始终为真 按照基本逻辑,我会说是的,但是我很困惑,我并不真的相信PHP。也许有人可以举个例子,但事实并非如此 另外,我想知道严格小于运算符和严格大于运算符(因为它们的含义被描述为严格,这是我在过去通过相等比较才知道的),如果用严格不等的值交换左操作数和右操作数,是否会有任何区别: # Precondition: if ($a === $b)

PHP以其类型转换而闻名。我必须承认这让我困惑,我很难在比较中找出基本的逻辑/基本的东西

例如:如果
$a>$b
为真且
$b>$c
为真,这是否意味着
$a>$c
也始终为真

按照基本逻辑,我会说是的,但是我很困惑,我并不真的相信PHP。也许有人可以举个例子,但事实并非如此

另外,我想知道严格小于运算符和严格大于运算符(因为它们的含义被描述为严格,这是我在过去通过相等比较才知道的),如果用严格不等的值交换左操作数和右操作数,是否会有任何区别:

# Precondition:
if ($a === $b) {
    throw new Exception(
       'Both are strictly equal - can not compare strictly for greater or smaller'
    );
}

($a > $b) !== ($b > $a)

对于大多数类型比较组合,这些都没有文档记录,因此在这种情况下阅读手册并没有真正的帮助。

PHP的比较运算符在几个方面偏离了计算机科学定义:

为了构成等价关系,
==
必须是自反的、对称的和传递的:

  • PHP的
    =
    运算符是非自反的,即
    $a==$a
    并不总是正确的:

    var_dump(NAN == NAN); // bool(false)
    
    注意:涉及
    NAN
    的任何比较总是
    false
    这一事实并不特定于PHP。它是由IEEE 754浮点运算标准()规定的

  • PHP的
    =
    运算符是对称的,即
    $a==$b
    $b==$a
    总是相同的

  • PHP的
    =
    运算符是不可传递的,即从
    $a==$b
    开始,
    $b==$c
    跟随
    $a==$c

    var_dump(true == "a"); // bool(true)
    var_dump("a" == 0);    // bool(true)
    var_dump(true == 0);   // bool(false)
    
    var_dump(-INF < 0);    // bool(true)
    var_dump(0 < TRUE);    // bool(true)
    var_dump(-INF < TRUE); // bool(false)
    
为了构成偏序,
=
必须是自反的、反对称的和传递的:


  • PHP的
    没有严格相同的比较运算符(
    =
    在您更正了问题的第二部分后,我将该部分的答案留给其他人。我只想对您问题的第一部分给出最令人惊讶的答案,即是否存在
    运算符不及物性的示例。这是

    这些都是正确的

    "10" < "1a"
    "1a" < "2"
    "10" > "2"
    

    哇,很好的答案。所以不可能用PHP来表达逻辑表达式,比如
    ($a>$b)和($b>$c)
    $a>$c
    ,即使文档上说那些
    运算符说它们很严格?但只有在处理相同的数据类型时,哪些运算符才遵循数学规则。类型转换才是真正造成混淆的原因(以及在许多其他情况下)。当比较数字、字符串和特殊值时,类型转换是在运算符之前完成的,因此严格来说比较运算符不会混淆,强制转换是…@ivanhoe011事实是:两者都是:)PHP的比较规则和PHP的强制转换规则不同,你不能简单地说
    $a==$b
    (类型)相同$a==(type)$b
    。一个简单的例子是
    “15”==“0xf”
    ,但是
    (int)“15”!==(int)“0xf”
    。PHP中的比较和强制转换规则都是完全疯狂的^@NikiC:
    (int)“0xf”
    的计算结果为整数
    0
    ,因此当然
    0!==15
    。本例中的比较行为与预期完全相同。这里混淆的是强制转换。我承认,
    (INF
    是一个真正的比较问题,但这是一个特例,正如您所指出的,它已经得到了解决。答案很好..+1我不一定会因为当时关于类型强制的一些有意义的决定而责怪PHP的设计人员…但我觉得他们应该注意到这些设计选择的结果,并进行了修改后来意识到这些选择显然是错误的。最明显的例子是@ravz的评论。+1更不用说带有固定列标题的可滚动“表”—漂亮的想法;)在进行类型转换时是否需要使用严格的运算符?我的意思是你写了
    if((string)$a==(string)$b)
    ,但这不是和
    if((string)$a==(string)$b)
    ?@Voitcus对两种类型的cast
    (string)1==(string)01'
    bool(true)
    和类型的juggle
    (1.'='01'
    bool(true)都是的
    与您在两个帐户上都会得到
    bool(false)
    时的
    =
    不完全相同一个吹毛求疵的地方:八进制值不是“在赋值时转换的”,它们是由编译器解释的,编译器必须将ASCII转换为实际的二进制数。
    无穷大等于无穷大,这在数学上是不正确的
    是一个有争议的说法。另请注意,
    NaN
    按惯例不大于、小于或等于我所知道的任何编程语言中的任何内容。我想您应该将该行更正为
    ($a>$b)!==($b<$a)
    ?啊,好吧,所以我误解了。我必须相应地修改我的答案。有趣的是,所有那些人都在写论文而不是答案,并且没有仔细阅读你的问题……前面的评论指的是答案的一部分(与问题的第二部分相关),我在删除的同时,现在删除了;)还有一个很好的新的
    sort()
    table,在写相关的博客文章时也选择了它。再次感谢你的回答。这是否意味着一个人应该尽可能使用
    usort
    。@Voitcus:我猜你的意思是
    usort($arr,'strcmp')
    。这是可行的(当然是针对字符串),但最好使用
    sort($arr,sort\u STRING)
    @WalterTross我的意思是始终使用自己的函数(不仅仅是针对字符串)来确保它总是正确的
    var_dump(-INF < 0);    // bool(true)
    var_dump(0 < TRUE);    // bool(true)
    var_dump(-INF < TRUE); // bool(false)
    
    var_dump(INF < []);           // bool(true)
    var_dump([] < new stdClass);  // bool(true)
    var_dump(new stdClass < INF); // bool(true)
    
    ($a > $b) == ($b < $a)
    ($a >= $b) == ($b <= $a)
    
    Very strange: $a VS. $b $a>$b $a<$b $a<=$b $a>=$b $a==$b $a===$b float(NAN) float(-INF) false false false false false false float(NAN) float(0) false false false false false false float(NAN) float(1) false false false false false false float(NAN) float(INF) false false false false false false float(NAN) float(NAN) false false false false false false float(NAN) int(-1) false false false false false false float(NAN) int(0) false false false false false false float(NAN) int(1) false false false false false false $a VS. $b $a>$b $a<$b $a<=$b $a>=$b $a==$b $a===$b NULL(NULL) array() false false true true true false NULL(NULL) bool(false) false false true true true false NULL(NULL) float(0) false false true true true false NULL(NULL) int(0) false false true true true false NULL(NULL) str('') false false true true true false array() bool(false) false false true true true false bool(false) float(0) false false true true true false bool(false) int(0) false false true true true false str('') bool(false) false false true true true false bool(false) str('0') false false true true true false float(-INF) bool(true) false false true true true false bool(true) float(1) false false true true true false float(INF) bool(true) false false true true true false float(NAN) bool(true) false false true true true false bool(true) int(-1) false false true true true false bool(true) int(1) false false true true true false bool(true) str("\0") false false true true true false bool(true) str('+') false false true true true false bool(true) str('-') false false true true true false bool(true) str('01') false false true true true false bool(true) str('1') false false true true true false bool(true) str('false') false false true true true false str('text') bool(true) false false true true true false str('true') bool(true) false false true true true false int(0) float(0) false false true true true false str("\0") float(0) false false true true true false str('') float(0) false false true true true false str('+') float(0) false false true true true false str('-') float(0) false false true true true false str('0') float(0) false false true true true false str('false') float(0) false false true true true false str('text') float(0) false false true true true false str('true') float(0) false false true true true false int(1) float(1) false false true true true false float(1) str('01') false false true true true false float(1) str('1') false false true true true false str("\0") int(0) false false true true true false str('') int(0) false false true true true false str('+') int(0) false false true true true false str('-') int(0) false false true true true false int(0) str('0') false false true true true false str('false') int(0) false false true true true false str('text') int(0) false false true true true false str('true') int(0) false false true true true false int(1) str('01') false false true true true false int(1) str('1') false false true true true false str('1') str('01') false false true true true false $a VS. $b $a>$b $a<$b $a<=$b $a>=$b $a==$b $a===$b float(NAN) str("\0") true true true true false false float(NAN) str('') true true true true false false float(NAN) str('+') true true true true false false float(NAN) str('-') true true true true false false float(NAN) str('0') true true true true false false float(NAN) str('01') true true true true false false float(NAN) str('1') true true true true false false float(NAN) str('false') true true true true false false float(NAN) str('text') true true true true false false float(NAN) str('true') true true true true false false $a VS. $b $a>$b $a<$b $a<=$b $a>=$b $a==$b $a===$b NULL(NULL) NULL(NULL) false false true true true true float(-INF) float(-INF) false false true true true true float(INF) float(INF) false false true true true true $a VS. $b $a>$b $a<$b $a<=$b $a>=$b $a==$b $a===$b NULL(NULL) bool(true) false true true false false false float(-INF) NULL(NULL) true false false true false false NULL(NULL) float(1) false true true false false false float(INF) NULL(NULL) true false false true false false float(NAN) NULL(NULL) true false false true false false NULL(NULL) int(-1) false true true false false false NULL(NULL) int(1) false true true false false false NULL(NULL) str("\0") false true true false false false NULL(NULL) str('+') false true true false false false NULL(NULL) str('-') false true true false false false NULL(NULL) str('0') false true true false false false NULL(NULL) str('01') false true true false false false NULL(NULL) str('1') false true true false false false NULL(NULL) str('false') false true true false false false NULL(NULL) str('text') false true true false false false NULL(NULL) str('true') false true true false false false array() bool(true) false true true false false false float(-INF) array() false true true false false false array() float(0) true false false true false false array() float(1) true false false true false false float(INF) array() false true true false false false float(NAN) array() false true true false false false array() int(-1) true false false true false false array() int(0) true false false true false false array() int(1) true false false true false false array() str("\0") true false false true false false str('') array() false true true false false false array() str('+') true false false true false false array() str('-') true false false true false false array() str('0') true false false true false false array() str('01') true false false true false false array() str('1') true false false true false false array() str('false') true false false true false false array() str('text') true false false true false false array() str('true') true false false true false false bool(true) bool(false) true false false true false false float(-INF) bool(false) true false false true false false float(1) bool(false) true false false true false false float(INF) bool(false) true false false true false false float(NAN) bool(false) true false false true false false bool(false) int(-1) false true true false false false int(1) bool(false) true false false true false false bool(false) str("\0") false true true false false false bool(false) str('+') false true true false false false bool(false) str('-') false true true false false false bool(false) str('01') false true true false false false str('1') bool(false) true false false true false false bool(false) str('false') false true true false false false str('text') bool(false) true false false true false false str('true') bool(false) true false false true false false bool(true) float(0) true false false true false false bool(true) int(0) true false false true false false str('') bool(true) false true true false false false bool(true) str('0') true false false true false false float(-INF) float(0) false true true false false false float(-INF) float(1) false true true false false false float(INF) float(-INF) true false false true false false float(-INF) int(-1) false true true false false false float(-INF) int(0) false true true false false false float(-INF) int(1) false true true false false false float(-INF) str("\0") false true true false false false float(-INF) str('') false true true false false false float(-INF) str('+') false true true false false false float(-INF) str('-') false true true false false false float(-INF) str('0') false true true false false false float(-INF) str('01') false true true false false false float(-INF) str('1') false true true false false false float(-INF) str('false') false true true false false false float(-INF) str('text') false true true false false false float(-INF) str('true') false true true false false false float(1) float(0) true false false true false false float(INF) float(0) true false false true false false float(0) int(-1) true false false true false false int(1) float(0) true false false true false false float(0) str('01') false true true false false false str('1') float(0) true false false true false false float(INF) float(1) true false false true false false float(1) int(-1) true false false true false false float(1) int(0) true false false true false false float(1) str("\0") true false false true false false str('') float(1) false true true false false false float(1) str('+') true false false true false false float(1) str('-') true false false true false false float(1) str('0') true false false true false false float(1) str('false') true false false true false false str('text') float(1) false true true false false false str('true') float(1) false true true false false false float(INF) int(-1) true false false true false false float(INF) int(0) true false false true false false float(INF) int(1) true false false true false false float(INF) str("\0") true false false true false false float(INF) str('') true false false true false false float(INF) str('+') true false false true false false float(INF) str('-') true false false true false false float(INF) str('0') true false false true false false float(INF) str('01') true false false true false false float(INF) str('1') true false false true false false float(INF) str('false') true false false true false false float(INF) str('text') true false false true false false float(INF) str('true') true false false true false false int(0) int(-1) true false false true false false int(1) int(-1) true false false true false false str("\0") int(-1) true false false true false false str('') int(-1) true false false true false false str('+') int(-1) true false false true false false str('-') int(-1) true false false true false false str('0') int(-1) true false false true false false int(-1) str('01') false true true false false false str('1') int(-1) true false false true false false str('false') int(-1) true false false true false false str('text') int(-1) true false false true false false str('true') int(-1) true false false true false false int(1) int(0) true false false true false false int(0) str('01') false true true false false false str('1') int(0) true false false true false false int(1) str("\0") true false false true false false str('') int(1) false true true false false false int(1) str('+') true false false true false false int(1) str('-') true false false true false false int(1) str('0') true false false true false false int(1) str('false') true false false true false false str('text') int(1) false true true false false false str('true') int(1) false true true false false false str('') str("\0") false true true false false false str('+') str("\0") true false false true false false str('-') str("\0") true false false true false false str("\0") str('0') false true true false false false str("\0") str('01') false true true false false false str('1') str("\0") true false false true false false str('false') str("\0") true false false true false false str('text') str("\0") true false false true false false str('true') str("\0") true false false true false false str('') str('+') false true true false false false str('') str('-') false true true false false false str('') str('0') false true true false false false str('') str('01') false true true false false false str('') str('1') false true true false false false str('') str('false') false true true false false false str('') str('text') false true true false false false str('') str('true') false true true false false false str('-') str('+') true false false true false false str('+') str('0') false true true false false false str('+') str('01') false true true false false false str('1') str('+') true false false true false false str('false') str('+') true false false true false false str('text') str('+') true false false true false false str('true') str('+') true false false true false false str('-') str('0') false true true false false false str('-') str('01') false true true false false false str('1') str('-') true false false true false false str('false') str('-') true false false true false false str('text') str('-') true false false true false false str('true') str('-') true false false true false false str('0') str('01') false true true false false false str('1') str('0') true false false true false false str('false') str('0') true false false true false false str('text') str('0') true false false true false false str('true') str('0') true false false true false false str('false') str('01') true false false true false false str('text') str('01') true false false true false false str('true') str('01') true false false true false false str('1') str('false') false true true false false false str('text') str('1') true false false true false false str('true') str('1') true false false true false false str('text') str('false') true false false true false false str('true') str('false') true false false true false false str('true') str('text') true false false true false false A<C : float(NAN) > str('a') > str('') A<C : float(NAN) > str('a') > str('1') A<C : float(NAN) > str('a') > str('A') A<C : float(NAN) > str('a') > str('0') A<C : float(NAN) > str('1') > str('') A<C : float(NAN) > str('1') > str('0') A<C : float(NAN) > str('A') > str('') A<C : float(NAN) > str('A') > str('1') A<C : float(NAN) > str('A') > str('0') A<C : float(NAN) > str('0') > str('') A<C : str('') > float(NAN) > str('a') A<C : str('') > float(NAN) > str('1') A<C : str('') > float(NAN) > str('A') A<C : str('') > float(NAN) > str('0') A<C : str('a') > str('') > float(NAN) A<C : str('a') > str('1') > float(NAN) A<C : str('a') > str('A') > float(NAN) A<C : str('a') > str('0') > float(NAN) A<C : str('0') > str('') > float(NAN) A==C : bool(true) > str('') > float(NAN) A==C : bool(true) > str('') > float(-INF) A==C : bool(true) > str('') > int(-1) A==C : bool(true) > str('') > float(-1) A==C : bool(true) > array() > float(NAN) A==C : bool(true) > array() > float(INF) A==C : bool(true) > array() > float(-INF) A==C : bool(true) > array() > str('a') A==C : bool(true) > array() > int(1) A==C : bool(true) > array() > float(1) A==C : bool(true) > array() > str('1') A==C : bool(true) > array() > str('A') A==C : bool(true) > array() > int(-1) A==C : bool(true) > array() > float(-1) A==C : bool(true) > int(0) > float(-INF) A==C : bool(true) > int(0) > int(-1) A==C : bool(true) > int(0) > float(-1) A==C : bool(true) > str('0') > float(NAN) A==C : bool(true) > str('0') > float(-INF) A==C : bool(true) > str('0') > int(-1) A==C : bool(true) > str('0') > float(-1) A==C : bool(true) > float(0) > float(-INF) A==C : bool(true) > float(0) > int(-1) A==C : bool(true) > float(0) > float(-1) A==C : int(1) > str('a') > str('1') A==C : int(1) > str('A') > str('1') A==C : float(1) > str('a') > str('1') A==C : float(1) > str('A') > str('1') A==C : str('a') > str('1') > int(0) A==C : str('a') > str('1') > float(0) A==C : str('') > float(-INF) > NULL(NULL) A==C : str('') > float(-INF) > bool(false) A==C : str('') > int(-1) > NULL(NULL) A==C : str('') > int(-1) > bool(false) A==C : str('') > float(-1) > NULL(NULL) A==C : str('') > float(-1) > bool(false) A==C : array() > float(NAN) > NULL(NULL) A==C : array() > float(NAN) > bool(false) A==C : array() > float(INF) > NULL(NULL) A==C : array() > float(INF) > bool(false) A==C : array() > float(-INF) > NULL(NULL) A==C : array() > float(-INF) > bool(false) A==C : array() > str('a') > NULL(NULL) A==C : array() > str('a') > bool(false) A==C : array() > int(1) > NULL(NULL) A==C : array() > int(1) > bool(false) A==C : array() > float(1) > NULL(NULL) A==C : array() > float(1) > bool(false) A==C : array() > str('1') > NULL(NULL) A==C : array() > str('1') > bool(false) A==C : array() > str('A') > NULL(NULL) A==C : array() > str('A') > bool(false) A==C : array() > str('0') > NULL(NULL) A==C : array() > int(-1) > NULL(NULL) A==C : array() > int(-1) > bool(false) A==C : array() > float(-1) > NULL(NULL) A==C : array() > float(-1) > bool(false) A==C : str('') > float(NAN) > bool(false) A==C : str('') > float(NAN) > NULL(NULL) A==C : str('A') > str('1') > int(0) A==C : str('A') > str('1') > float(0) A==C : int(0) > float(-INF) > NULL(NULL) A==C : int(0) > float(-INF) > bool(false) A==C : int(0) > int(-1) > NULL(NULL) A==C : int(0) > int(-1) > bool(false) A==C : int(0) > float(-1) > NULL(NULL) A==C : int(0) > float(-1) > bool(false) A==C : str('0') > float(NAN) > bool(false) A==C : str('0') > float(-INF) > bool(false) A==C : str('0') > int(-1) > bool(false) A==C : str('0') > float(-1) > bool(false) A==C : float(0) > float(-INF) > NULL(NULL) A==C : float(0) > float(-INF) > bool(false) A==C : float(0) > int(-1) > NULL(NULL) A==C : float(0) > int(-1) > bool(false) A==C : float(0) > float(-1) > NULL(NULL) A==C : float(0) > float(-1) > bool(false) A===C : str('0') > float(NAN) > str('0') A===C : str('') > float(NAN) > str('') A===C : str('a') > float(NAN) > str('a') A===C : str('1') > float(NAN) > str('1') A===C : str('A') > float(NAN) > str('A')
    "10" < "1a"
    "1a" < "2"
    "10" > "2"
    
    "10" < "2"
    
    sort(array("10", "1a", "2" )) => array("10", "1a", "2" )
    sort(array("10", "2",  "1a")) => array("1a", "2",  "10")
    sort(array("1a", "10", "2" )) => array("2",  "10", "1a")
    sort(array("1a", "2",  "10")) => array("1a", "2",  "10")
    sort(array("2",  "10", "1a")) => array("2",  "10", "1a")
    sort(array("2",  "1a", "10")) => array("10", "1a", "2" )