PHP "Uyarı: usort () [function.usort]: Geçersiz karşılaştırma fonksiyonu"

2 Cevap php

i bir ilişkisel dizi olarak aşağıdaki verileri var

array
  'abc' => 
    array
      'label' => string 'abc' (length=3)
      'weight' => float 3
  'wsx' => 
    array
      'label' => string 'wsx' (length=3)
      'weight' => float 1
  'qay' => 
    array
      'label' => string 'qay' (length=3)
      'weight' => float 1
  'http://test.com' => 
    array
      'label' => string 'http://test.com' (length=15)
      'weight' => float 0
  'Nasi1' => 
    array
      'label' => string 'Nasi1' (length=5)
      'weight' => float 0
  'fax' => 
    array
      'label' => string 'fax' (length=3)
      'weight' => float 4

Ben "etiket" veya "ağırlık" kullanarak diziyi sıralamak istiyorum

Etiket için karşılaştırma fonksiyonu:

function compare_label($a, $b)
{
    return strnatcmp($a['label'], $b['label']);
}

ve daha ben sadece başka bir işlevden işlevini çağırır:

usort($label, 'compare_label');
var_dump($label);

ama sonra hata mesajı alıyorum ve dizi sıralanır. Ben yanlış yapıyorum, bilmiyorum. Ben yerine denedim:

  • usort($label, 'compare_label'); ile usort($label, compare_label);
  • usort($label, 'compare_label'); ile usort($label, $this->compare_label);

olmadan başarı. Birisi bana bir ipucu verebilir misiniz?

2 Cevap

compare_label, bir üye işlev (örneğin, sınıf yöntemi) ise o zaman farklı geçmek gerekir.

usort( $label, array( $this, 'compare_label' ) );

Temelde, yerine sadece işlev adı bir dize gönderme, sen ilk öğe bağlam (yöntem bulunabilir hangi nesne) bir iki eleman dizi, gönderme ve 2. elemanı işlev adının dizedir .

Senin yöntem statik ise NOTE:, daha sonra dizinin ilk elemanı olarak sınıf adını geçmek

usort( $label, array( __CLASS__, 'compare_label' ) );

Karşılaştırmak işlevi genel bir işlevi olarak ya da bir nesnenin bir yöntemi olarak tanımlanır? Bu bir yöntem ise, size biraz onu aramak nasıl değiştirmeniz gerekir:

usort($label, array($object, "compare_label"));

Ayrıca sınıfının kendisi statik bir yöntem olarak ilan edebilir:

public static function compare_label ($a, $b) {
   [...]
}

usort($label, array(Class_Name, "compare_label"));