您不僅可以使用匿名函數,還可以使用閉包,
function ($a,$b) use ($sort) { ... }
$ sort將在函數體中可用。 自足例如:
<?php
function getFn($sort) {
return function($a, $b) use($sort) {
if($a->$sort > $b->$sort) return 1;
if($a->$sort < $b->$sort) return -1;
return 0;
};
}
$abuseCases = array(
(object)array('ID'=>1, 'Sender'=>'Sender A'),
(object)array('ID'=>3, 'Sender'=>'Sender D'),
(object)array('ID'=>2, 'Sender'=>'Sender C'),
(object)array('ID'=>4, 'Sender'=>'Sender B')
);
echo "\n----- Sort By Sender ----\n";
usort($abuseCases, getFn('Sender'));
foo($abuseCases);
echo "\n----- Sort By ID ----\n";
usort($abuseCases, getFn('ID'));
foo($abuseCases);
function foo($a) {
foreach($a as $o) {
echo $o->ID, ' ', $o->Sender, "\n";
}
}
打印
----- Sort By Sender ----
1 Sender A
4 Sender B
2 Sender C
3 Sender D
----- Sort By ID ----
1 Sender A
2 Sender C
3 Sender D
4 Sender B
更新:用PHP < 5.3你可以使用一個對象,而不是一個匿名函數。我們希望第二個參數是callable
。這可以是php 5.3中的一個浮動函數,但它也可以是一個函數的名稱....或者一個對象和一個方法名稱,如array($obj, 'methodName')
那樣傳遞。
$abuseCases = getData();
echo "\n----- Sort By Sender ----\n";
usort($abuseCases, array(new Foo('Sender'), 'compare'));
foo($abuseCases);
echo "\n----- Sort By ID ----\n";
usort($abuseCases, array(new Foo('ID'), 'compare'));
foo($abuseCases);
class Foo {
public $propName; // protected?
public function __construct($propertyName) {
$this->propName = $propertyName;
}
public function compare($a, $b) {
$prop = $this->propName;
if($a->$prop > $b->$prop) return 1;
if($a->$prop < $b->$prop) return -1;
return 0;
}
}
function foo($a) {
foreach($a as $o) {
echo $o->ID, ' ', $o->Sender, "\n";
}
}
function getData() {
return array(
(object)array('ID'=>1, 'Sender'=>'Sender A'),
(object)array('ID'=>3, 'Sender'=>'Sender D'),
(object)array('ID'=>2, 'Sender'=>'Sender C'),
(object)array('ID'=>4, 'Sender'=>'Sender B')
);
}
(如果你大量使用的這一點 - 或者不想寫這樣一個-_-藉口 - 你可能希望定義一個接口一樣interface Comparator { ... }
,讓富實現該接口,並且有一定的功能/使用比較器的類,即usort()周圍的對象的包裝器。)
它爲什麼失敗?你看到了什麼結果? – codaddict 2010-09-20 07:09:40
在第一次嘗試中,顯然找不到$ sort。在第二次嘗試中,我不知道如何引用函數'srt'。 – Hubro 2010-09-20 07:19:11