2015-05-29 97 views
0

我在擴展ArrayObject的PHP類中排序項目時遇到問題。PHP - 排序ArrayObject

我正在創建我的類,我想通過添加cmp()函數的唯一方法是將其放在同一個文件中,但不在類中。我似乎無法將它放在其他任何地方,因爲uasort需要函數名稱作爲字符串。

所以我這樣做:

class Test extends ArrayObject{ 

    public function __construct(){ 
     $this[] = array('test' => 'b'); 
     $this[] = array('test' => 'a'); 
     $this[] = array('test' => 'd'); 
     $this[] = array('test' => 'c'); 
    } 


    public function sort(){ 
     $this->uasort('cmp'); 
    } 

} 

function cmp($a, $b) { 
    if ($a['test'] == $b['test']) { 
     return 0; 
    } else { 
     return $a['test'] < $b['test'] ? -1 : 1; 
    } 
} 

這是好的,如果我只使用一類這樣的,但如果我使用兩個(或者通過自動加載或要求),那麼它打破的努力調用cmp()兩次。

我想我的觀點是這似乎是一個壞方法來做到這一點。有沒有其他方法可以將cmp()函數保存在類本身中?

+0

我知道我可以稱他們爲不同的東西,但這似乎並不是一個很好的解決方案。 – dgig

+0

創建一個包含此函數和其他類似實用函數的util.php文件。然後require_once('util.php');當你需要它時。 – dan08

回答

3

你可能只是這樣做,而不是調用一個函數只讓它作爲一個匿名函數。

PHP 5.3.0或更高版本僅

class Test extends ArrayObject{ 

    public function __construct(){ 
     $this[] = array('test' => 'b'); 
     $this[] = array('test' => 'a'); 
     $this[] = array('test' => 'd'); 
     $this[] = array('test' => 'c'); 
    } 


    public function sort(){ 
     $this->uasort(function($a, $b) { 
      if ($a['test'] == $b['test']) { 
       return 0; 
      } else { 
       return $a['test'] < $b['test'] ? -1 : 1; 
      } 
     }); 
    } 
} 

爲匿名函數只在PHP 5.3.0或更高的工作,這將是更兼容的選項,如果你需要低於目標的PHP版本5.3.0

下面PHP 5.3.0

class Test extends ArrayObject{ 

    public function __construct(){ 
     $this[] = array('test' => 'b'); 
     $this[] = array('test' => 'a'); 
     $this[] = array('test' => 'd'); 
     $this[] = array('test' => 'c'); 
    } 


    public function sort(){ 
     $this->uasort(array($this, 'cmp')); 
    } 

    public function cmp($a, $b) { 
     if ($a['test'] == $b['test']) { 
      return 0; 
     } else { 
      return $a['test'] < $b['test'] ? -1 : 1; 
     } 
    } 

} 
+0

該死,這很有趣,我發誓我試過這個並沒有奏效。謝謝,這是一個完美可行的解決方案。 – dgig

+2

您使用的是哪個版本的PHP?匿名功能直到PHP 5.3.0才能使用 – Augwa

+0

對於那些遠在後面的人來說,這是一個好點。我在5.3.2(幸運的是,不幸的是,總體而言)。 – dgig

3

事實證明這是正確的PHP文檔(用戶評論部分) - >http://php.net/manual/en/function.uasort.php

magikMaker 3年前 在此提醒的語法,如果你想在一個類或對象使用uasort :

​​
+1

我正在輸入這個過程。 +1實際閱讀手冊(和評論)。另外,[手冊](http://php.net/uasort)說比較函數的詳細信息見[usort](http://php.net/usort),並在該頁面上有[示例]( http://php.net/manual/en/function.usort.php#function.usort.examples.object)訪問一個靜態類。 –

+0

我想真正深刻的答案是在這裏學習關於「callable」類型在這裏:http://php.net/manual/en/language.types.callable.php – dgig