web-dev-qa-db-fra.com

équivalent strcmp pour les entiers (strcmp) dans PHP

Nous avons donc obtenu cette fonction en PHP

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

Nous n'avons cependant pas d'intcmp (); J'en ai donc créé un:

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

C'est juste sale. Qu'en pensez-vous tous?

cela fait partie d'une classe pour trier les Javascripts par une valeur de classement passée.

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

Triez vos données avec:

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

Utilisez $ b- $ a si vous voulez l'ordre inversé.

Si les nombres en question dépassent la plage entière de PHP, return ($a < $b) ? -1 : (($a > $b) ? 1 : 0) est plus robuste.

98
Nicolas Viennot

Vous pourriez utiliser

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

Bien que je ne vois pas du tout l'intérêt d'utiliser cette fonction

12
nico

pourquoi réinventer la roue? 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

Testez-le ici: https://3v4l.org/pSANR

8

À titre purement supplémentaire, il existe un RFC accepté pour cela ( https://wiki.php.net/rfc/combined-comparison-operator ).

Ainsi, la fonction de comparaison serait dans le sens de ...

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

Une fonctionnalité vraiment intéressante ici est que la comparaison se fait exactement de la même manière que toutes les autres comparaisons. Donc, le jonglage de type se fera comme prévu.

Pour l'instant, il n'existe pas de méthode magique comme __forCompare () pour permettre à un objet d'exposer une valeur de comparaison. La proposition actuelle (un RFC différent) est d'injecter chaque objet dans chaque autre objet pendant la comparaison afin qu'il fasse la comparaison - quelque chose qui me semble étrange - possibilité potentielle de récursivité et de débordement de pile ...! J'aurais pensé que soit l'injection du type d'objet à comparer (permettant à un objet la capacité de représenter des valeurs appropriées en fonction du type de comparaison) soit une demande aveugle d'une valeur que l'objet peut servir à la comparaison aurait été plus sûre Solution.

Pas encore intégré à PHP-NG (PHP 7 pour le moment), mais nous l'espérons, bientôt.

8

Doit-il être +1 et -1? Sinon, retournez simplement (int) $a - (int) $b. Je n'aime pas le fossé que quelqu'un d'autre a recommandé, et il n'est pas nécessaire de vérifier les trois cas. S'il n'est pas supérieur et différent, il doit être inférieur à.

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

Je ne l'appellerais pas sale en soi, cela semble assez valable. Mais je ne peux pas penser où j'utiliserais cette fonction. Ma seule suggestion pourrait être d'inclure 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

En un coup d'œil, oui, il semble sale. Sauf qu'il doit y avoir une bonne raison pour laquelle vous avez écrit cela au lieu d'utiliser simplement le ==, >, et < les opérateurs. Quelle a été la motivation pour créer cette fonction?

Si c'était moi, je ferais probablement quelque chose comme:

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

Je me rends compte que c'est tout aussi moche, et le : null; - je ne sais pas si PHP l'exige ou si j'aurais pu le faire :; mais je n'aime pas ça et ce code ne devrait jamais s'exécuter de toute façon ... Je pense que je serais beaucoup moins confus à ce sujet si je connaissais les exigences d'origine!