2011-05-19 83 views
89

OK使用usort與功能並不複雜在PHP中使用usort一類私有函數

這是我在我的線性碼之前有

function merchantSort($a,$b){ 
    return ....// stuff; 
} 

$array = array('..','..','..'); 

排序我根本就

usort($array,"merchantSort"); 

現在我們升級代碼並刪除所有全局函數並將它們放在適當的位置。現在,所有的代碼是一個類,我無法弄清楚如何使用usort函數來這是一個簡單的函數

class ClassName { 
    ... 

    private function merchantSort($a,$b) { 
     return ...// the sort 
    } 

    public function doSomeWork() { 
    ... 
     $array = $this->someThingThatReturnAnArray(); 
     usort($array,'$this->merchantSort'); // ??? this is the part i can't figure out 
    ... 

    } 
} 

的問題是如何做的一個目的方法來代替參數數組排序我所說的usort()函數

回答

181

內物體的方法,讓你的排序功能靜:

private static function merchantSort($a,$b) { 
     return ...// the sort 
} 

,並使用數組的第二個參數:

$array = $this->someThingThatReturnAnArray(); 
usort($array, array('ClassName','merchantSort')); 
+2

這太好了!我還想指出,sort函數不必作爲靜態方法被隱式*聲明;因爲它仍然沒有:) – Jimbo 2013-03-05 16:00:32

+0

@Jimbo - 這是有道理的,所以私人函數可以使用實例化和類變量。是的,這太棒了!另請參閱@deceze答案,您可以在其中傳遞'$ this'(neato)。 – Ben 2013-05-13 07:50:10

+3

如果你讓函數是靜態的(你應該),你可以寫'usort($ array,'ClassName:merchantSort')',不是嗎? – caw 2013-09-23 00:45:28

3

在這個例子中我按照名爲AverageVote的數組中的字段進行排序。

你可以包括通話,這意味着你不再有類範圍內的問題,像這裏面的方法...

 usort($firstArray, function ($a, $b) { 
      if ($a['AverageVote'] == $b['AverageVote']) { 
       return 0; 
      } 

      return ($a['AverageVote'] < $b['AverageVote']) ? -1 : 1; 
     }); 
+1

這使得只有在您僅在這一種情況下使用此功能時纔有意義。在許多情況下,許多地方都使用相同的比較。 – silk 2013-04-09 12:39:58

9

你需要傳遞$this例如:usort($myArray, array($this, 'mySort'));

完整的示例:

class SimpleClass 
{      
    function getArray($a) {  
     usort($a, array($this, 'nameSort')); // pass $this for scope 
     return $a; 
    }     

    private function nameSort($a, $b) 
    { 
     return strcmp($a, $b); 
    }    

} 

$a = ['c','a','b']; 
$sc = new SimpleClass(); 
print_r($sc->getArray($a)); 
+0

你的答案中有一個語法錯誤。 – codescribblr 2014-04-22 21:43:29

+0

@Jonathan - 查看更新的答案。 – Justin 2014-04-22 22:11:03

+0

第二部分現在好多了。但是你的第一個例子中仍然缺少「)」。 – codescribblr 2014-04-23 12:43:13

相關問題