strcmp等效于PHP中的整数(strcmp)

时间:2010-05-17 20:40:23

标签: php function integer compare

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

8 个答案:

答案 0 :(得分:95)

使用以下方式对数据进行排序:

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

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

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

答案 1 :(得分:12)

您可以使用

function intcmp($a,$b)
    {
    return ($a-$b) ? ($a-$b)/abs($a-$b) : 0;
    }

虽然我没有看到使用此功能的重点

答案 2 :(得分: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

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

答案 3 :(得分:7)

纯粹作为一些额外的信息,已经有一个公认的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),但希望很快就能完成。

答案 4 :(得分:4)

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

return (int) $a > (int) $b ? 1 : (int) $a == (int) $b ? 0 : -1;

答案 5 :(得分:3)

我不会把它称为本身,似乎足够有效。但我想不出我会在哪里使用这个功能。我唯一的建议可能是加入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;
}

答案 6 :(得分:1)

乍一看,是的,感觉很脏。除了必须有一个良好的原因之外,您不必使用实际的==><运算符。创建此功能的动机是什么?

如果是我,我可能只会做一些事情:

$x = $a==$b ? 0 : ($a>$b ? 1 : ($a<$b ? -1 : null));

我意识到这同样丑陋,: null; - 不确定PHP是否需要它,或者我是否可以完成:;但是我不喜欢它并且代码永远不会执行无论如何......如果我知道最初的要求,我想我会对此感到困惑!

答案 7 :(得分:0)

对于字符串

bookData.removeAll(where: {bookData.contains(bookDetail)})

orderFlag => 1(升序):-1(降序)

数字

 usort($points, function ($a, $b) use ($orderFlag, $key1, $key2) {
        return strcmp($a[$key1][$key2], $b[$key1][$key2]) * $orderFlag;
    });

orderFlag => 1(升序):-1(降序)