我在扩展ArrayObject的PHP类中排序项时遇到问题。
我正在创建我的类,并且我想通过添加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 :(得分:4)
你可以这样做,而不是调用一个函数只是让它成为一个匿名函数。
仅限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.1.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;
}
}
}
答案 1 :(得分:3)
原来这在PHP文档(用户评论部分)中是正确的 - &gt; http://php.net/manual/en/function.uasort.php
4年前magikMaker 如果要在类或对象中使用uasort,请快速提醒一下语法:
<?php
// procedural:
uasort($collection, 'my_sort_function');
// Object Oriented
uasort($collection, array($this, 'mySortMethod'));
// Objet Oriented with static method
uasort($collection, array('self', 'myStaticSortMethod'));
?>