如何在具有数组数组的对象上使用usort

时间:2015-12-30 19:18:58

标签: php arrays sorting

简单地说:我需要根据类属性中特定数组元素的特定值对对象数组进行排序。

如果有效的话,这会很棒: Psuedo code that illustrates what I need

在这张图片中,代码说明了我想要的内容:我希望能够告诉我们查看特定的数组元素并找到 priority 键,并根据该整数值进行排序。

因此,对于给定的钩子(hook-foo),我需要进行比较:

 $plugin->hooks['hook-foo']['priority']

对于另一个可能对其执行操作的钩子(钩子栏),我需要进行排序:

 $plugin->hooks['hook-bar']['priority']

如果usort支持我向它发送任意参数,这将得到解决。但是,下面的代码是为了说明我的观点而编写的,然后进行了测试,因为“也许它会起作用”。它没有。

如何重新排列以获得我需要的排序?

(注意:Plugin :: hooks是一个数组数组,代表在给定钩子上执行插件所需的所有元数据。所以,可能包含'hook-foo'和'hook -bar',它不会同时执行。它也可能包含一个或另一个,或者......都没有。)

编辑:以下是示例结构,这可能有助于说明我的观点。这显示了14个插件中的2个已加载。

Example of two plugins

您可以看到每个插件都响应多个不同的挂钩。

所以,如果我想控制给定钩子的顺序,我只需要改变该钩子的优先级。

例如,在这里:您可以看到 cli-init 挂钩触发类declareMySelf的方法,该方法只是在命令行界面中说:“插入XYZ加载”。两个优先级都是50,因此它将以系统找到插件的任何顺序显示它们。

但是,如果我想显示“PHP Mailer loaded”,那么在显示“Config / Settings management loaded”之前,我应该做的就是将PHP Mailer插件优先级降低到40。

1 个答案:

答案 0 :(得分:1)

您的类中可能应该有$hookSearchKey属性,并在需要时使用setHookSearchKey()方法设置它:

class Whatever {
    // ...
    private $hookSearchKey

    public function setHookSearchKey($key) {
        $this->hookSearchKey = $key;
    }

    //... this is your method of sorting:
    public function fooSort(...) {
        $this->setHookSearchKey('hook-foo');
        usort(...); // do your thing
    }

    //... this is your method of sorting:
    public function barSort(...) {
        $this->setHookSearchKey('hook-bar');
        usort(...); // do your thing
    }

    //...

    public function sortByHookPriority(...) {
        if($a[$this->hookSearchKey] == $b[$this->hookSearchKey]) return 0;

        // ...
    }
}

这对你有用吗?