web-dev-qa-db-ja.com

PHPの整数(strcmp)に相当するstrcmp

この関数をPHPで取得しました

strcmp(string $1,string $2) // returns -1,0, or 1;

ただし、intcmp()はありません。だから私は1つを作成しました:

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;
    }
    ....
}
61
Chase Wilson

データを並べ替える:

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

順序を逆にする場合は、$ b- $ aを使用します。

問題の数値がPHPの整数範囲を超える場合、return ($a < $b) ? -1 : (($a > $b) ? 1 : 0)はより堅牢です。

98
Nicolas Viennot

使用できます

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

この関数を使用する意味はまったくありませんが

12
nico

なぜ車輪を再発明したのですか? 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

8

純粋にいくつかの追加情報として、このために受け入れられた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)にはまだ統合されていませんが、近いうちに導入されることを期待しています。

8

+1と-1にする必要がありますか?そうでない場合は、(int) $a - (int) $b。私は他の誰かが勧めた格差が好きではないので、3つのケースすべてをチェックする必要はありません。大きくなく、等しくない場合は、より小さい必要があります。

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

私はそれを呼び出しませんdirtyそれ自体、十分に妥当であるようです。しかし、私はその機能をどこで使用するか考えられません。私の唯一の提案は、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;
}
3
JYelton

一見、汚れているように感じます。ただし、実際の==>、および<演算子を使用する代わりに、good理由を記述したことを除きます。この関数を作成する動機は何ですか?

それが私なら、おそらく次のようなことをするでしょう。

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

私はこれが同じくらいいことを理解し、: null;-PHPがそれを必要とするか、:;をちょうどできたかもしれないが、私はそれが好きではないとにかくそのコードは決して実行されるべきではありません...元の要件を知っていれば、これについてはあまり混乱しないと思います!