Итак, мы получили эту функцию в 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; } .... }
Сортируйте свои данные с помощью:
function sortScripts($a, $b) { return $a['order'] - $b['order']; }
Используйте $ b- $ a, если вы хотите изменить порядок.
Если числа, о которых идет речь, превышают целочисленный диапазон PHP, return ($a < $b) ? -1 : (($a > $b) ? 1 : 0)
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; }); ?>
Несколько действительно приятная особенность здесь заключается в том, что сравнение осуществляется точно так же, как и все другие сравнения. Таким образом, жонглирование типа произойдет, как ожидалось.
Пока еще нет волшебного метода __forCompare (), позволяющего объекту выставлять значение сравнения. Текущее предложение (другое RFC) заключается в том, чтобы каждый объект вводился в каждый другой объект во время сравнения, чтобы он выполнял сравнение – что-то, что мне кажется странным, – потенциальная возможность для рекурсии и переполнения стека …! Я бы подумал, что нужно вводить тип объекта для сравнения (позволяющий объекту возможность представлять соответствующие значения в зависимости от типа сравнения) или слепой запрос на значение, которое объект может обслуживать для сравнения, было бы безопаснее решение.
Еще не интегрирован в PHP-NG (PHP 7 на данный момент), но, надеюсь, скоро.
Я бы не назвал это грязным как таковым, это кажется достаточно правильным. Но я не могу думать, где бы я использовал эту функцию. Мое единственное предложение – включить 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;
зачем изобретать колесо? 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
С первого взгляда, да, он чувствует себя грязным. Кроме того, должна быть веская причина, по которой вы написали, что вместо использования реальных операторов ==
, >
и <
. Какова была мотивация для создания этой функции?
Если бы это был я, я бы просто сделал что-то вроде:
$x = $a==$b ? 0 : ($a>$b ? 1 : ($a<$b ? -1 : null));
Я понимаю, что это так же уродливо, и : null;
– не уверен, требуется ли PHP, или я мог бы только что сделать :;
но мне это не нравится, и этот код никогда не должен выполняться в любом случае … Я думаю, что я был бы намного менее смущен, если бы знал первоначальные требования!