2009-08-04 69 views
4

我具有以下數據作爲關聯數組PHP「警告:usort()[function.usort]:無效比較函數」排序

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 

我想用「標記」或「重量數組進行排序「

該標籤的比較功能是:

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

,比我只需要調用該函數從另一個功能:

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

但後來我得到錯誤消息,數組未被排序。我不知道,我做錯了什麼。我試圖取代:

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

沒有成功。有人可以給我一個提示嗎?

回答

21

如果compare_label是一個成員函數(即類方法),那麼你需要以不同的方式傳遞它。

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

基本上,而不是僅僅發送函數名的字符串,則發送一個二單元陣列,其中第一元素是上下文(在其上可以找到的方法的對象),並且第二元件是函數名稱的字符串。

注:如果你的方法是靜態的,那麼你把類名作爲

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

是的,是一個成員函數....它的工作原理! :) – cupakob 2009-08-04 19:18:09

1

是比較函數定義爲全局函數或對象的方法數組的第一個元素?如果它是一個方法,你必須改變你的小幅叫它:

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

你也可以把它聲明爲類本身的靜態方法:

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

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