【问题标题】:PHP: I have an associative array (int => object), want to sort itPHP:我有一个关联数组(int => object),想要对其进行排序
【发布时间】:2011-01-20 14:22:35
【问题描述】:
class DownTime {
    public $total, $longest, $count;
}

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

我知道uasort 会做得很好。但是,作为一种 OOP 方法,我更愿意在 DownTime 类中定义一个特殊的函数(比如在 C++ 中定义 operator<(),或者在 Java 中实现 Comparable.compareTo()),而不是在调用某种排序函数时传递一个函数。

【问题讨论】:

    标签: php oop sorting


    【解决方案1】:

    您可以在 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 的角度来看这更好。

    【讨论】:

    • 是的,这比定义一个任意名称的函数然后忘记它要好。但是,我确实希望有更好的东西,那就是 PHP 语言。无论如何,这是一个很好的解决方案,特别是如果 PHP 程序员是这样做的。谢谢。
    • PHP 没有这样的 Comparable 接口,但是很容易添加一个(刚刚添加到我的答案中)。
    【解决方案2】:

    仍然使用该语言的另一个选项是创建一个扩展 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();
    

    但我发现我通常不需要使用迭代器/数组对象的原生数组。

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

    【讨论】:

    • 谢谢。当我在 php.net 上阅读不同类型的文件时,我认为 natsort 可能是这里的解决方案。但是,正如您在此处所述,对于我目前在 php.ini 中的问题,似乎没有一个足够优雅的解决方案。谢谢。
    • 是的,SPL Interfaces 很好,但他们确实需要在语言中实现SortableComparable 和其他一些语言,以使其真正透明和强大。但就目前而言,这就是我们所拥有的......
    猜你喜欢
    • 1970-01-01
    • 2016-06-09
    • 1970-01-01
    • 2014-05-22
    • 1970-01-01
    • 2021-08-04
    • 2017-06-15
    • 1970-01-01
    相关资源
    最近更新 更多