PHP 中整数的 strcmp 等价物 (intcmp)

2022-08-30 08:50:38

所以我们在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;
}

这感觉很脏。你们都怎么看?

这是按传入的排序值对 Javascript 进行排序的类的一部分。

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;
    }
    ....
}

答案 1

对数据进行排序:

function sortScripts($a, $b)
{
    return $a['order'] - $b['order'];
}

如果需要相反的顺序,请使用 $b-$a。

如果所讨论的数字超过PHP的整数范围,则更健壮。return ($a < $b) ? -1 : (($a > $b) ? 1 : 0)


答案 2

纯粹作为一些附加信息,已经有一个公认的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)中,但希望很快就会集成到PHP-NG中。


推荐