代码之家  ›  专栏  ›  技术社区  ›  Chase Wilson

php中整数的strcmp equivalent(intcmp)

  •  57
  • Chase Wilson  · 技术社区  · 16 年前

    所以我们在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;
        }
        ....
    }
    
    7 回复  |  直到 10 年前
        1
  •  94
  •   Chuck Le Butt    11 年前

    数据排序方式:

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

    如果您想要颠倒的顺序,请使用$B-$A。

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

        2
  •  12
  •   nico    16 年前

    你可以使用

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

    尽管我根本看不到使用这个函数的意义

        3
  •  8
  •   Gabriele Manganello    10 年前

    为什么要重新发明轮子? 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

        4
  •  7
  •   Richard A Quadling    11 年前

    纯粹作为一些附加信息,已经有了一个接受的RFC( https://wiki.php.net/rfc/combined-comparison-operator )

    所以,比较函数是沿着…

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

    这里有一个非常好的特性,那就是比较的方式与所有其他比较的方式完全相同。因此,类型杂耍将按预期发生。

    到目前为止,还没有类似magic uuuforcompare()的方法允许对象公开比较值。当前的建议(不同的RFC)是在比较期间将每个对象注入到其他每个对象中,以便进行比较(我觉得这很奇怪)递归和堆栈溢出的潜在机会…!我本以为,输入要比较的对象类型(允许对象根据比较的类型来表示适当的值)或对对象可用于比较的值的盲请求是一种更安全的解决方案。

    目前还没有集成到php-ng(php 7)中,但希望很快就会实现。

        5
  •  4
  •   tomlogic    16 年前

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

    return (int) $a > (int) $b ? 1 : (int) $a == (int) $b ? 0 : -1;
    
        6
  •  3
  •   JYelton Melchior Blausand    16 年前

    我不会叫它 肮脏的 从本质上来说,它似乎足够有效。但我想不出在哪里使用这个函数。我唯一的建议是 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;
    }
    
        7
  •  1
  •   FrustratedWithFormsDesigner    16 年前

    乍一看,是的,感觉很脏。但必须有一个 好的 你写这个的原因,而不是仅仅使用 == , > 和 < 运算符。创建这个函数的动机是什么?

    如果是我,我可能会做如下的事情:

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

    我知道这也很难看, : null; -不确定PHP是否需要它,或者我是否可以这样做 :; 但我不喜欢它,而且无论如何代码都不应该执行…我想如果我知道最初的需求,我就不会那么困惑了!

    推荐文章