在PHP中用于整数(intcmp)的strcmp equivelant
所以我们在PHP中获得了这个function
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; }
这只是感觉肮脏。 你们都在想什么?
这是通过传入的sorting值对JavaScript进行sorting的类的一部分。
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; } .... }
用以下方式sorting数据:
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 )。
所以,比较function将沿着…
<?php $data = [...]; usort($data, function($left, $right){ return $left <=> $right; }); ?>
这里有一些非常好的function,就是和其他所有的比较完全一样。 所以玩杂耍会按预期发生。
到目前为止,还没有像__forCompare()这样的方法允许一个对象公开一个比较值。 当前的build议(不同的RFC)是在比较过程中将每个对象都注入到其他对象中,以便进行比较 – 对我来说这似乎很奇怪 – 有可能发生recursion和堆栈溢出。 我可能会认为要么注入比较types的对象(允许一个对象能够根据比较的types来表示适当的值),要么就是一个盲目的对象可以用来比较的值的请求会更安全解。
尚未集成到PHP-NG(目前是PHP 7),但希望很快就会出现。
我不会把它称为肮脏的 ,它似乎足够有效。 但我不知道我会在哪里使用这个function。 我唯一的build议可能是包含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
在这里testing: https : //3v4l.org/pSANR
一目了然,是的,它感觉很脏。 除了必须有一个很好的理由,而不是仅仅使用实际的==
, >
和<
运算符。 创build这个function的动机是什么?
如果是我,我可能只是做一些事情:
$x = $a==$b ? 0 : ($a>$b ? 1 : ($a<$b ? -1 : null));
我意识到这是同样丑陋的: null;
– 不知道如果PHP需要它,或者如果我可以刚刚完成:;
但我不喜欢它,代码永远不应该执行……我想如果我知道原始的要求,我会less一些困惑!