在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一些困惑!