PHP usort işlevi çağrıları optimize ile Yardım

4 Cevap php

Bu benim usort() benim geri arama

public function sortProperties($a, $b) {

        $sortA = inflector::camelize(str_replace('-', '_', $this->sortBy));
        $sortB = inflector::camelize(str_replace('-', '_', $this->sortBy));

        $a = Arr::get($a, $sortA);
        $b = Arr::get($b, $sortB);


        if (is_numeric($a) AND is_numeric($b)) {
            return  $a < $b; 
        } else {
            return strcasecmp($a, $b); 
        }


    }

I any benim kod içinde ilk 2 satır gördüğünüzde Genellikle, bana bağırır: refactor! Ben aynıdır çünkü sanırım.

Ben bir işlev getCamelized() yapabilir biliyorum, ama ben bu dışında tekrar kullanmak sanmıyorum.

2 içine bu 4 hat açmak için bir yolu var mı? func_get_args() veya array_walk() burada bana yardımcı olabilir mi?

Ayrıca, bu sıralama işlevi hakkında yanlış bir şey var mı?

4 Cevap

Is there a way to turn those 4 lines into 2?

    $sortA = $sortB = inflector::camelize(str_replace('-', '_', $this->sortBy));

Ve diğer iki satır:

    list($a, $b) = array(Arr::get($a, $sortA), Arr::get($b, $sortB));

Tür için olduğu gibi, en azından benim için iyi olacak gibi görünüyor.

$sortA == $sortB o kısmı sadece çoğaltma yani. Hesaplayın $sortA set yerde bir kez $this->sortBy. Eğer saplanmışsın Arr::get hatları. return $a < $b; yanlış gözüküyor, 0, a-ve + sayı ettik iade edilmelidir.

...
function setSortBy($sortBy) {
    $this->sortBy = $sortBy;
    $this->sortByCam = inflector::camelize(str_replace('-', '_', $sortBy));
}
....

public function sortProperties($a, $b) {

    $a = Arr::get($a, $this->sortByCam);
    $b = Arr::get($b, $this->sortByCam);

    if (is_numeric($a) && is_numeric($b)) {
        return $a - $b;
    } else {
        return strcasecmp($a, $b); 
    }

}

Onun gibi bir şey. Ana fikir döngünün camelizing bölümünü almak için.

strcasecmp bir int dönecektir (1, 0 veya -1) ve < bir boolean dönecektir farkında olun. Eğer gerçekten birini veya diğer kullanarak gerekir. Ayrıca strnatcasecmp muhtemelen bu yüzden bu bir deneyin size numaraları ve dizeleri hem istediğiniz davranışı verecek unutmayın:

public function sortProperties($a, $b) {
  $aInflected = Arr::get($a, $sort = inflector::camelize(str_replace('-', '_', $this->sortBy)));
  return strcasecmp($aInflected, Arr::get($b, $sort));
}

"Program Optimizasyonu Birinci Kural: yapmayın. Program Optimizasyonu İkinci Kural (uzmanlar için sadece!):. Henüz Yapmayın "- Michael A. Jackson

Ne kırık değil düzeltmek yok diyor başka bir kural da vardır. Bir düşünün; Bu kod sadece bir satır, sen bu soruyu gönderme cevabını okuma ve tüm yorumlarınız proje içinde farklı bir görev için bir kod büyük bölümünü yazmak için kullanılan olabilirdi harcanan zamanı.