PHP tamsayılar için Strcmp equivelant (intcmp)

6 Cevap php

Bu yüzden PHP bu işlevi var

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

Biz ancak,) (bir intcmp yok; Yani ben birini yarattı:

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

Bu sadece kirli hissediyor. Tüm ne düşünüyorsunuz?

Bu geçirilen bir sipariş değerine göre Javascriptleri sıralamak için bir sınıfın parçası

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

6 Cevap

Ile verileri sıralamak:

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

Eğer ters sırasını isterseniz $ b-$ a kullanın.

Sen kullanabilirsiniz

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

Ben tüm bu fonksiyonu kullanarak nokta görmüyorum rağmen

Bir bakışta, evet bu kirli hissediyor. Eğer yazdı good nedeni olmalı dışında yerine sadece gerçek ==, >, ve < operatörlerini kullanarak. Bu fonksiyonu oluşturmak için motivasyon neydi?

Bana olsaydı, muhtemelen gibi bir şey yapmak istiyorum:

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

Ben bu gibi çirkin olduğunu biliyoruz, ve : null; - Emin PHP gerektiriyorsa ya da ben sadece :; yaptık ama eğer ben onu sevmiyorum ve bu kod asla gerektiği takdirde zaten idam ... Ben orijinal şartları bilseydim bu konuda çok daha az karışık olacağını düşünüyorum!

O +1 ve -1 olmak zorunda mı? Aksi takdirde, sadece (int) $a - (int) $b return. Ben başkasının tavsiye ki bölünmeyi sevmiyorum, ve her üç durumda kontrol etmek gerek yoktur. Bu daha büyük ve eşit değil ise, o daha az olmalıdır.

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

I dirty başına, yeterince geçerli görünüyor demezdim. Ben bu işlevi kullanmak istiyorsunuz ama nerede ben düşünemiyorum. Benim tek önerim dahil olabilir 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;
}

Eğer hala sonuç sıfır / negatif / pozitif olup olmadığını belirlemek için bir karşılaştırma operatörünü kullanmak zorunda - - Bu kod bir tamsayı döndürür, çünkü aslında tamsayılar karşılaştırmak yardımcı olmuyor bu yüzden de sadece özgün değerleri (karşılaştırma olabilir de olacak oldukça hızlı)