【发布时间】:2012-03-24 09:20:18
【问题描述】:
我想做的是创建一个Comparable 类,类似于.NET 中的IComparable,这样您就可以像这样实例化它:
$cmp = new MultiArrayCompare(2);
然后您可以通过以下方式对数组进行排序:
usort($myArray, $cmp);
它会对第二个索引上的数组进行排序。为此,我想usort 会尝试像函数一样调用$cmp,所以我必须以某种方式覆盖该行为。 __call 看起来不像我想要的那样(想了一会儿,它就像 Python 的 __call__)。
如果这是不可能的...是否有另一种好方法来创建此问题的通用解决方案?您可以在哪里创建用户定义的排序函数,但给它传递一些值(在本例中为“2”)?
使用__invoke 我能够创建这些类:
abstract class Comparable {
abstract function Compare($a, $b);
function __invoke($a, $b) {
return $this->Compare($a, $b);
}
}
class ArrayCompare extends Comparable {
private $key;
function __construct($key) {
$this->key = $key;
}
function Compare($a, $b) {
if($a[$this->key] == $b[$this->key]) return 0;
return $a[$this->key] < $b[$this->key] ? -1 : 1;
}
}
class ArrayCaseCompare extends Comparable {
private $key;
function __construct($key) {
$this->key = $key;
}
function Compare($a, $b) {
return strcasecmp($a[$this->key], $b[$this->key]);
}
}
我可以用来对数组数组进行排序:
$arr = array(
array(1,2,3),
array(2,3,4),
array(3,2,4),
)
usort($arr,new ArrayCompare(1));
【问题讨论】:
标签: php