<=> in php 7 在检查 bool 值的情况下如何响应?
How does <=> in php 7 responsed in situations that check bool values?
正在查看 php 7,但 <=> 让我感到困惑。
大多数时候我使用条件运算符,它们用于布尔情况(<=> 几乎,但不完全是,也能够 return -1)。 (如果 X <=> Y)。所以我不确定在以下情况下会发生什么...
if ($x <=> $y) {
// Do all the 1 things
} else {
// Do all the 2 things
}
如果它前面有...我能期待什么
$x = 0; $y = 1;
或
$x = "Carrot"; $y = "Carrot Juice";
或
$x = "Carrot Juice"; $y = "Carrot";
或
$x = array(carrot, juice); $y = "carrot juice";
肯定有足够多的案例让我困惑它会做什么。
为什么不自己尝试一下,然后玩转你得到的那艘新宇宙飞船呢?
此外,如果您想知道如何比较 spaceship operator works, see: http://php.net/manual/en/types.comparisons.php
但是现在如果我们想更详细地了解您的测试数据:
第一种情况:
//Test data
$x = 0;
$y = 1;
//operator
0 <=> 1 //0 is smaller than 1, so result: -1
//-1 evaluates to TRUE in the if statement
第二种情况:
//Test data
$x = "Carrot";
$y = "Carrot Juice";
//operator
"Carrot" <=> "Carrot Juice" //"Carrot" is smaller than "Carrot Juice", so result: -1
//-1 evaluates to TRUE in the if statement
第三种情况:
//Test data
$x = "Carrot Juice";
$y = "Carrot";
//operator
"Carrot Juice" <=> "Carrot" //"Carrot Juice" is bigger than "Carrot", so result: 1
//1 evaluates to TRUE in the if statement
第四种情况:
//Test data
$x = array("carrot", "juice");
$y = "carrot juice";
//operator
array("carrot", "juice") <=> "carrot juice" //array("carrot", "juice") is bigger than "carrot juice", so result: 1
//1 evaluates to TRUE in the if statement
宇宙飞船操作员(以及其他 PHP 7 个新增内容)在此处以通俗易懂的语言解释:
https://blog.engineyard.com/2015/what-to-expect-php-7
它主要用于提供给 usort
.
等函数的比较函数
// Pre PHP 7
function order_func($a, $b) {
return ($a < $b) ? -1 : (($a > $b) ? 1 : 0);
}
// Post PHP 7
function order_func($a, $b) {
return $a <=> $b;
}
在if
中用处不大,因为if
只检查值是真值还是假值,不区分表示顺序的不同真值。如果你确实在布尔上下文中使用它,当值不同时它将被认为是 true
(因为 1
和 -1
是真实的),false
当它们'重新相等(因为 0
是错误的)。这类似于尝试在布尔上下文中使用 strcmp()
和 stricmp()
,这就是为什么您经常看到
if (stricmp($x, $y) == 0)
here 给出了将数组与比较运算符一起使用的规则(向下滚动到标记为与各种类型进行比较 的table)。比较一个数组和另一个数组时,规则是:
Array with fewer members is smaller, if key from operand 1 is not found in operand 2 then arrays are uncomparable, otherwise - compare value by value
将数组与另一种类型进行比较时,数组总是更大。所以 array('carrot', 'juice') <=> 'carrot juice'
将是 1
.
简介
spaceship operator <=>
是一个 non-associative 二元运算符,其优先级与相等运算符相同(==
、!=
, ===
, !==
).
此运算符的目的是允许在 left-hand 和 right-hand 操作数之间进行更简单的 three-way 比较。
可能的结果
操作员可以产生以下任何结果:
0
:当两个操作数相等时
-1
:当left-hand操作数小于right-hand操作数时
1
:当left-hand操作数大于right-hand操作数时。
所以,这意味着:
1 <=> 1; // output : 0
1 <=> 2; // output : -1
2 <=> 1; // output : 1
实际应用
使用此运算符的一个很好的实际应用是在比较类型回调中,根据两个值之间的 three-way 比较,预期 return 零、负或正整数。传递给 usort
的比较函数就是这样一个例子。
在PHP 7之前,你会这样写:
$arr = [4,2,1,3];
usort($arr, function ($a, $b) {
if ($a < $b) {
return -1;
} elseif ($a > $b) {
return 1;
} else {
return 0;
}
});
因为PHP7,你可以这样写:
$arr = [4,2,1,3];
usort($arr, function ($a, $b) {
return $a <=> $b;
});
正在查看 php 7,但 <=> 让我感到困惑。
大多数时候我使用条件运算符,它们用于布尔情况(<=> 几乎,但不完全是,也能够 return -1)。 (如果 X <=> Y)。所以我不确定在以下情况下会发生什么...
if ($x <=> $y) {
// Do all the 1 things
} else {
// Do all the 2 things
}
如果它前面有...我能期待什么
$x = 0; $y = 1;
或
$x = "Carrot"; $y = "Carrot Juice";
或
$x = "Carrot Juice"; $y = "Carrot";
或
$x = array(carrot, juice); $y = "carrot juice";
肯定有足够多的案例让我困惑它会做什么。
为什么不自己尝试一下,然后玩转你得到的那艘新宇宙飞船呢?
此外,如果您想知道如何比较 spaceship operator works, see: http://php.net/manual/en/types.comparisons.php
但是现在如果我们想更详细地了解您的测试数据:
第一种情况:
//Test data $x = 0; $y = 1;
//operator 0 <=> 1 //0 is smaller than 1, so result: -1 //-1 evaluates to TRUE in the if statement
第二种情况:
//Test data $x = "Carrot"; $y = "Carrot Juice";
//operator "Carrot" <=> "Carrot Juice" //"Carrot" is smaller than "Carrot Juice", so result: -1 //-1 evaluates to TRUE in the if statement
第三种情况:
//Test data $x = "Carrot Juice"; $y = "Carrot";
//operator "Carrot Juice" <=> "Carrot" //"Carrot Juice" is bigger than "Carrot", so result: 1 //1 evaluates to TRUE in the if statement
第四种情况:
//Test data $x = array("carrot", "juice"); $y = "carrot juice";
//operator array("carrot", "juice") <=> "carrot juice" //array("carrot", "juice") is bigger than "carrot juice", so result: 1 //1 evaluates to TRUE in the if statement
宇宙飞船操作员(以及其他 PHP 7 个新增内容)在此处以通俗易懂的语言解释:
https://blog.engineyard.com/2015/what-to-expect-php-7
它主要用于提供给 usort
.
// Pre PHP 7
function order_func($a, $b) {
return ($a < $b) ? -1 : (($a > $b) ? 1 : 0);
}
// Post PHP 7
function order_func($a, $b) {
return $a <=> $b;
}
在if
中用处不大,因为if
只检查值是真值还是假值,不区分表示顺序的不同真值。如果你确实在布尔上下文中使用它,当值不同时它将被认为是 true
(因为 1
和 -1
是真实的),false
当它们'重新相等(因为 0
是错误的)。这类似于尝试在布尔上下文中使用 strcmp()
和 stricmp()
,这就是为什么您经常看到
if (stricmp($x, $y) == 0)
here 给出了将数组与比较运算符一起使用的规则(向下滚动到标记为与各种类型进行比较 的table)。比较一个数组和另一个数组时,规则是:
Array with fewer members is smaller, if key from operand 1 is not found in operand 2 then arrays are uncomparable, otherwise - compare value by value
将数组与另一种类型进行比较时,数组总是更大。所以 array('carrot', 'juice') <=> 'carrot juice'
将是 1
.
简介
spaceship operator <=>
是一个 non-associative 二元运算符,其优先级与相等运算符相同(==
、!=
, ===
, !==
).
此运算符的目的是允许在 left-hand 和 right-hand 操作数之间进行更简单的 three-way 比较。
可能的结果
操作员可以产生以下任何结果:
0
:当两个操作数相等时-1
:当left-hand操作数小于right-hand操作数时1
:当left-hand操作数大于right-hand操作数时。
所以,这意味着:
1 <=> 1; // output : 0
1 <=> 2; // output : -1
2 <=> 1; // output : 1
实际应用
使用此运算符的一个很好的实际应用是在比较类型回调中,根据两个值之间的 three-way 比较,预期 return 零、负或正整数。传递给 usort
的比较函数就是这样一个例子。
在PHP 7之前,你会这样写:
$arr = [4,2,1,3];
usort($arr, function ($a, $b) {
if ($a < $b) {
return -1;
} elseif ($a > $b) {
return 1;
} else {
return 0;
}
});
因为PHP7,你可以这样写:
$arr = [4,2,1,3];
usort($arr, function ($a, $b) {
return $a <=> $b;
});