чего strcmp эквивалент для целых чисел (intcmp) в PHP
Итак, мы получили эту функцию в PHP
strcmp(string ,string ) // 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 ответов:
сортировка данных с:
function sortScripts($a, $b) { return $a['order'] - $b['order']; }
используйте $b - $a, если вы хотите обратный порядок.
Если рассматриваемые числа превышают целочисленный диапазон PHP,
return ($a < $b) ? -1 : (($a > $b) ? 1 : 0)
является более надежной.
вы могли бы использовать
function intcmp($a,$b) { return ($a-$b) ? ($a-$b)/abs($a-$b) : 0; }
хотя я не вижу смысла в использовании этой функции на всех
чисто как некоторая дополнительная информация, для этого был принят RFC (https://wiki.php.net/rfc/combined-comparison-operator).
таким образом, функция сравнения будет вдоль линий ...
<?php $data = [...]; usort($data, function($left, $right){ return $left <=> $right; }); ?>
несколько действительно приятная особенность здесь заключается в том, что сравнение делается точно так же, как и все другие сравнения. Так что жонглирование типа произойдет, как и ожидалось.
пока еще нет метода magic __forCompare () like, чтобы разрешить объект для предоставления значения сравнения. Текущее предложение (другой RFC) состоит в том, чтобы каждый объект был введен в каждый другой объект во время сравнения, чтобы он делал сравнение - что - то, что мне кажется странным-потенциальная возможность рекурсии и переполнения стека ... ! Я бы подумал, что либо вводит тип объекта для сравнения (позволяя объекту представлять соответствующие значения в зависимости от типа сравнения), либо слепой запрос на значение что объект может служить для сравнения, было бы более безопасным решением.
еще не интегрирован в PHP-NG (PHP 7 на данный момент), но, надеюсь, скоро будет.
зачем изобретать колесо? 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
Я бы не назвал это грязный по сути, это кажется достаточно обоснованным. Но я не могу думать, где я буду использовать эту функцию. Мое единственное предложение может заключаться в том, чтобы включить
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 и -1? Если нет, просто верните
(int) $a - (int) $b
. Мне не нравится разделение, которое кто-то еще рекомендовал, и нет необходимости проверять все три случая. Если оно не больше и не равно,то должно быть меньше.return (int) $a > (int) $b ? 1 : (int) $a == (int) $b ? 0 : -1;
на первый взгляд, да он чувствует себя грязным. Кроме того, должно быть хороший почему вы написали, что вместо того, чтобы просто используя фактический
==
,>
и<
операторы. Какая была мотивация для создания этой функции?если бы это был я, я бы, наверное, просто сделать что-то вроде:
$x = $a==$b ? 0 : ($a>$b ? 1 : ($a<$b ? -1 : null));
Я понимаю, что это так же некрасиво, и
: null;
- не уверен, что PHP требует этого, или если бы я мог просто сделать:;
но мне это не нравится, и этот код никогда не должен в любом случае выполнить... Я думаю, что я был бы намного меньше смущен об этом, если бы я знал оригинальные требования!