PHP:我有一个关联数组(int => object),想要对它进行排序

时间:2011-01-20 14:22:36

标签: php oop sorting

class DownTime {
    public $total, $longest, $count;
}

我有一个关联数组(键是id,值是DownTime对象) 我想根据$ total总计来排序 我已经阅读了有关stackoverflow的PHP: Sorting Arrays和其他一些问题。

我理解uasort可以胜任这项工作。但是,作为一种OOP方法,我更喜欢在DownTime类中定义一个特殊函数(比如在C ++中定义operator<(),或在Java中实现Comparable.compareTo()),而不是在调用某个sort函数时传递一个函数

2 个答案:

答案 0 :(得分:5)

您可以在DownTime类上定义compare()方法:

class DownTime {
    public $total, $longest, $count;
    public static function compare(DownTime $a, DownTime $b) {
        // compare $a and $b here, and return -1, 0, 1
    }
}

然后像这样使用uasort:

uasort($array, 'DownTime::compare')

PHP中没有这样的“Comparable”接口,但在useland中实现它会非常简单:

interface Comparable {
    function compareTo($a);
}

// a generic compare function
function compare($a, $b) {
    if ($a instanceof Comparable) return $a->compareTo($b);
    if ($a < $b) return -1;
    if ($a > $b) return 1;
    return 0;
}

// now you can sort without knowing anything about what the array contains:
uasort($array, 'compare');

如果您希望能够使用ArrayObject透明地执行此操作:

class SortableArrayObject extends ArrayObject
{
    function asort() {
        return $this->uasort('compare'); // you can even make compare() a member of
                                         // SortableArrayObject and use 
                                         // $this->uasort(array($this,'compare'))
    }
}

$arrayObject->asort();

这里容器对容器一无所知,从OOP的角度来看,这是更好的。

答案 1 :(得分:1)

在使用该语言时,另一个选项是创建一个扩展Iterator而不是使用本机数组的迭代器集合类。

实际上,您还可以扩展ArrayObject并覆盖sort方法:

class MyArrayObject extends ArrayObject {
    public function natsort() {
        $this->uasort(function($a, $b) {
            return $a->total > $b->total ? 1 : -1;
        });
    }
}

$arrayObject = new MyArrayObject($array);
$arrayObject->natsort();

foreach ($arrayObject as $value) {
    //sorted values
}

或者如果你真的需要一个原生数组:

$array = $arrayObject->getArrayCopy();

但我发现我通常不需要使用迭代器/ arrayobjects的本机数组。

对类本身的比较函数的另一种替代方法......