PHP中的strcmp equivelant for Integers(intcmp)

Cha*_*son 63 php integer compare function

所以我们在PHP中使用了这个函数

strcmp(string $1,string $2) // returns -1,0, or 1;
Run Code Online (Sandbox Code Playgroud)

但是,我们不要有一个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;
}
Run Code Online (Sandbox Code Playgroud)

这只是感觉很脏.你们都觉得怎么样?

这是通过传入的排序值对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;
    }
    ....
}
Run Code Online (Sandbox Code Playgroud)

Nic*_*not 101

使用以下内容对数据进

function sortScripts($a, $b)
{
    return $a['order'] - $b['order'];
}
Run Code Online (Sandbox Code Playgroud)

如果您想要颠倒顺序,请使用$ b- $ a.

如果有问题的数字超过PHP的整数范围,return ($a < $b) ? -1 : (($a > $b) ? 1 : 0)则更加健壮.

  • 为了澄清@aioobe所说的,如果整数超过php的整数范围(64位有符号)并且隐式转换为浮点值,则此实现会中断.因此,虽然`($ a - $ b)`显然要快得多,但它不像`($ a <$ b)那么强大?-1 :(($ a> $ b)?1:0)`在所有情况下都适用. (13认同)
  • 与许多其他语言一样,此实现[破解](http://ideone.com/N5v06H). (5认同)

nic*_*ico 12

你可以用

function intcmp($a,$b)
    {
    return ($a-$b) ? ($a-$b)/abs($a-$b) : 0;
    }
Run Code Online (Sandbox Code Playgroud)

虽然我根本没有看到使用这个功能的重点

  • 它是聪明的oneliner和所有,但1行并不总是比3更简单.如果我遇到这个代码只是为了实现它所做的所有它返回+ 1/0/-1所有我会抓挠我的头那些划分和模数.我会选择原始版本tbh. (2认同)

Ric*_*ing 8

纯粹作为一些额外的信息,已经有一个公认的RFC(https://wiki.php.net/rfc/combined-comparison-operator).

所以,比较功能将是......

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

这里有一些非常好的功能是比较与所有其他比较完全相同.因此类型杂耍将按预期发生.

到目前为止,还没有允许对象公开比较值的魔法__forCompare()方法.当前的提议(一个不同的RFC)是在比较期间将每个对象注入到每个其他对象中,以便它进行比较 - 这对我来说似乎很奇怪 - 递归和堆栈溢出的潜在机会......!我会想到要么注入对象类型进行比较(允许对象能够根据比较的类型表示适当的值),要么盲目请求对象可以提供用于比较的值,这样会更安全解.

尚未集成到PHP-NG(目前是PHP 7),但希望很快就能实现.


Gab*_*llo 8

为什么重新发明轮子? 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
Run Code Online (Sandbox Code Playgroud)

在此测试:https: //3v4l.org/pSANR


tom*_*gic 5

它必须是+1和-1吗?如果没有,只需返回(int) $a - (int) $b。我不喜欢其他人推荐的划分,也没有必要检查所有三种情况。如果它不大于也不等于,则必须小于。

return (int) $a > (int) $b ? 1 : (int) $a == (int) $b ? 0 : -1;
Run Code Online (Sandbox Code Playgroud)