Как именно оператор космического корабля php сравнивает строки, массивы и объекты

Мне интересно, как оператор космического корабля php сравнивает строки, объекты и массивы. Например, приведенный ниже код.

echo "Its Me at SO" <=> "Its Me at SO"; 

вернет 0, так как я знаю, что все символы одинаковы, счетчик такой же. Но если у меня есть код, как показано ниже:

echo "Its me at SO" <=> "its Me at so"; 

Он вернет 1, это означает, что левая сторона больше правой, но как? Это сравнение значений ASCII?

Теперь перейдем к массивам. Приведенный ниже код вернет 0, поскольку оба массива равны по количеству, значениям и значениям в каждом индексе.

echo [1,2,3] <=> [1,2,3];

Но приведенный ниже код возвращает -1.

echo [1,2,3] <=> [3,2,1]; 

И я не понимаю почему? Как этот оператор сравнивает массивы и как он вычисляет, что массив слева меньше, чем массив справа? То же самое и с объектами.

Кто-нибудь может дать подробный ответ о том, как это работает со строками, массивами и объектами?

Спасибо


person Altaf Hussain    schedule 15.01.2016    source источник
comment
Он будет выполнять проверки на равенство / неравенство так же, как и операторы сравнения. Таким образом, он будет сравнивать строки так же, как и с другими операторами и массивами или чем-то еще. Космический корабль - это просто оболочка, которая по-прежнему использует ту же логику.   -  person Alma Do    schedule 15.01.2016
comment
echo "Its Me at SO" <=> "its Me at SO"; вернет 0. Не для меня это не так: он возвращает 1, чего я и ожидал, поскольку i больше I. Вы действительно получаете за это 0?   -  person Adam Cameron    schedule 15.01.2016
comment
Извините, это была опечатка с моей стороны. Обновил свой ответ.   -  person Altaf Hussain    schedule 15.01.2016


Ответы (2)


"Сравнение выполняется в соответствии с обычными правилами сравнения типов PHP (http://php.net/manual/en/types.comparisons.php) ".

1) Да, он использует значения ASCII

2) Если массивы имеют разную длину, массив с меньшим количеством значений будет меньше.

В противном случае он сравнивает массивы по ключам, отдавая приоритет «более ранним» значениям. Например, сначала сравнивая $arr1[0] с $arr2[0]. Если $arr1 имеет ключ, которого нет в $arr2, массивы не сопоставимы (например, если мы используем нечисловые массивы).

// Arrays are compared like this with standard comparison operators
// $arr1 and $arr2 are arrays
function standard_array_compare($arr1, $arr2)
{
   // If either array has more values, that array is considered "larger"
    if (count($arr1) < count($arr2)) {
        return -1; // $arr1 < $arr2
    } elseif (count($arr1) > count($arr2)) {
        return 1; // $arr1 > $arr2
    }

    //Otherwise compare the array values directly
    foreach ($arr1 as $key => $val) {
        if (!array_key_exists($key, $arr2)) {
            return null; // uncomparable, these arrays do not have the same keys
        } elseif ($val < $arr2[$key]) {
            return -1; // $arr1 < $arr2
        } elseif ($val > $arr2[$key]) {
            return 1; // $arr1 > $arr2
        }
    }
    return 0; // $arr1 == $arr2
}

Обратите внимание: приведенный выше код не является фактическим кодом PHP, а лишь приблизительным представлением используемой логики.

По сути, он обрабатывает массив так же, как сравнение числа с прямым порядком байтов. Он сравнивает $arr1[0] с $arr2[0]. Если они разные, возвращается -1 или 1, в зависимости от того, что больше. Если они совпадают, переходят к $arr1[1] и $arr2[1]. Если все значения совпадают, возвращается 0 (массивы равны)

Хотя это не совсем то же самое, было бы проще рассматривать [1,2,3] <=> [3,2,1] как эквивалент 123 <=> 321...

person Jon Story    schedule 15.01.2016

Согласно новым функциям документация

Сравнение выполняется в соответствии с обычными правилами сравнения типов PHP.

<?php
// Integers
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1

// Floats
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1

// Strings
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1
person Luke    schedule 15.01.2016