strcmp equivelant для целых чисел (intcmp) в PHP - PullRequest
59 голосов
/ 18 мая 2010

Итак, мы получили эту функцию в PHP

strcmp(string $1,string $2) // returns -1,0, or 1;

Однако у нас нет intcmp (); Итак, я создал один:

function intcmp($a,$b) {
    if((int)$a == (int)$b)return 0;
    if((int)$a  > (int)$b)return 1;
    if((int)$a  < (int)$b)return -1;
}

Это просто кажется грязным. Что вы все думаете?

это часть класса для сортировки Javascripts по переданному значению упорядочения.

class JS
{
    // array('order'=>0,'path'=>'/js/somefile.js','attr'=>array());
    public $javascripts = array(); 
    ...
    public function __toString()
    {
        uasort($this->javascripts,array($this,'sortScripts'));
        return $this->render();
    }
    private function sortScripts($a,$b)
    {
        if((int)$a['order'] == (int)$b['order']) return 0;
        if((int)$a['order'] > (int)$b['order']) return 1;
        if((int)$a['order'] < (int)$b['order']) return -1;
    }
    ....
}

Ответы [ 7 ]

97 голосов
/ 18 мая 2010

Сортируйте данные с помощью:

function sortScripts($a, $b)
{
    return $a['order'] - $b['order'];
}

Используйте $ b- $ a, если вы хотите изменить порядок.

Если указанные числа превышают целочисленный диапазон PHP, return ($a < $b) ? -1 : (($a > $b) ? 1 : 0)более надежный.

12 голосов
/ 18 мая 2010

Вы можете использовать

function intcmp($a,$b)
    {
    return ($a-$b) ? ($a-$b)/abs($a-$b) : 0;
    }

Хотя я вообще не вижу смысла в использовании этой функции

8 голосов
/ 16 июня 2016

зачем изобретать велосипед? http://php.net/manual/en/function.strnatcmp.php

echo strnatcmp(1, 2) . PHP_EOL; // -1
echo strnatcmp(10, 2) . PHP_EOL; // 1
echo strnatcmp(10.5, 2) . PHP_EOL; // 1 - work with float numbers
echo strnatcmp(1, -2) . PHP_EOL; // 1 - work with negative numbers

Проверьте это здесь: https://3v4l.org/pSANR

7 голосов
/ 12 мая 2015

Чисто в качестве дополнительной информации для этого принят RFC (https://wiki.php.net/rfc/combined-comparison-operator).

Итак, функция сравнения будет иметь вид ...

<?php
$data = [...];
usort($data, function($left, $right){ return $left <=> $right; });
?>

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

Пока что нет магического метода, подобного __forCompare (), который позволял бы объекту выставлять сравнительное значение. Текущее предложение (другой RFC) состоит в том, чтобы каждый объект был введен в каждый другой объект во время сравнения, чтобы он выполнял сравнение - что мне кажется странным - потенциальная возможность рекурсии и переполнения стека ... Я бы подумал, что либо введение типа объекта для сравнения (предоставление объекту возможности представлять соответствующие значения в зависимости от типа сравнения), либо слепой запрос значения, которое объект может предоставить для сравнения, был бы более безопасным. решение.

Еще не интегрирован в PHP-NG (сейчас PHP 7), но, надеюсь, скоро будет.

4 голосов
/ 18 мая 2010

Должно ли быть +1 и -1? Если нет, просто верните (int) $a - (int) $b. Мне не нравится разделение, которое рекомендовал кто-то еще, и нет необходимости проверять все три случая. Если оно не больше и не равно, оно должно быть меньше.

return (int) $a > (int) $b ? 1 : (int) $a == (int) $b ? 0 : -1;
3 голосов
/ 18 мая 2010

Я бы не назвал это грязным само по себе, это кажется вполне допустимым. Но я не могу думать, где бы я использовал эту функцию. Мое единственное предложение может включать в себя else:

function intcmp($a,$b)
{
    if((int)$a == (int)$b)return 0;
    else if((int)$a  > (int)$b)return 1;
    else if((int)$a  < (int)$b)return -1;
}
1 голос
/ 18 мая 2010

На первый взгляд, да, это кажется грязным. За исключением того, что должна быть хорошая причина, по которой вы написали, вместо того, чтобы просто использовать действительные операторы ==, > и <. Какова была мотивация для создания этой функции?

Если бы это был я, я бы просто сделал что-то вроде:

$x = $a==$b ? 0 : ($a>$b ? 1 : ($a<$b ? -1 : null));

Я понимаю, что это так же некрасиво, и : null; - не уверен, требует ли это PHP или мог бы я просто сделать :;, но мне это не нравится, и этот код никогда не должен выполняться в любом случае ... Я думаю, я был бы намного менее смущен этим, если бы знал первоначальные требования!

...