php 7 — Как работает & lt; = & gt; в PHP 7 ответил в ситуациях, которые проверяют значения bool?

Смотря в php 7 на пути, но <=> смущает меня.

Большую часть времени я использую условные операторы, они используются в логических ситуациях (которые <=> почти есть, но не совсем, возможность вернуть -1). (Если Х <=> 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";

Там определенно достаточно случаев, что меня смущает то, что он будет делать.

2

Решение

Вступление

оператор космического корабля <=> это неассоциативным бинарный оператор с тем же приоритетом, что и операторы равенства (==, !=, ===, !==).

Целью этого оператора является упрощение трехстороннего сравнения между левым и правым операндами.


Возможные результаты

Оператор может выдать любой из следующих результатов:

  • 0 : когда оба операнда равны
  • -1 : когда левый операнд меньше правого операнда
  • 1 : когда левый операнд больше правого операнда.

Итак, это означает:

1 <=> 1; // output : 0
1 <=> 2; // output : -1
2 <=> 1; // output : 1

Практическое применение

Хорошее практическое применение этого оператора — обратные вызовы типа сравнения, которые, как ожидается, будут возвращать нулевое, отрицательное или положительное целое число на основе трехстороннего сравнения между двумя значениями. Функция сравнения передана 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;
}
});

Начиная с PHP 7, вы можете написать это:

$arr = [4,2,1,3];

usort($arr, function ($a, $b) {
return $a <=> $b;
});
1

Другие решения

Оператор космического корабля (и другие дополнения 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)

Даны правила использования массивов с операторами сравнения. Вот (прокрутите вниз до таблицы с надписью Сравнение с различными типами). При сравнении массива с другим массивом, правило таково:

Массив с меньшим числом элементов меньше, если ключ от операнда 1 не найден в операнде 2, тогда массивы несопоставимы, в противном случае — сравните значение по значению

При сравнении массива с другим типом массив всегда больше. Так array('carrot', 'juice') <=> 'carrot juice' будет 1,

7

Почему бы просто не попробовать и не поиграть с новым космическим кораблем?

демонстрация

Кроме того, если вам интересно, как сравнение оператор космического корабля работает, см .: http://php.net/manual/en/types.comparisons.php


Но теперь, если мы хотим немного подробнее рассказать о ваших тестовых данных:

  1. Первый случай:

    //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
    
  2. Второй случай:

    //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
    
  3. Третий случай:

    //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
    
  4. Четвертый случай:

    //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
    
2
По вопросам рекламы [email protected]