简单地说:我需要根据类属性中特定数组元素的特定值对对象数组进行排序。
在这张图片中,代码说明了我想要的内容:我希望能够告诉我们查看特定的数组元素并找到 priority 键,并根据该整数值进行排序。
因此,对于给定的钩子(hook-foo),我需要进行比较:
$plugin->hooks['hook-foo']['priority']
对于另一个可能对其执行操作的钩子(钩子栏),我需要进行排序:
$plugin->hooks['hook-bar']['priority']
如果usort支持我向它发送任意参数,这将得到解决。但是,下面的代码是为了说明我的观点而编写的,然后进行了测试,因为“也许它会起作用”。它没有。
如何重新排列以获得我需要的排序?
(注意:Plugin :: hooks是一个数组数组,代表在给定钩子上执行插件所需的所有元数据。所以,可能包含'hook-foo'和'hook -bar',它不会同时执行。它也可能包含一个或另一个,或者......都没有。)
编辑:以下是示例结构,这可能有助于说明我的观点。这显示了14个插件中的2个已加载。
您可以看到每个插件都响应多个不同的挂钩。
所以,如果我想控制给定钩子的顺序,我只需要改变该钩子的优先级。
例如,在这里:您可以看到 cli-init 挂钩触发类declareMySelf的方法,该方法只是在命令行界面中说:“插入XYZ加载”。两个优先级都是50,因此它将以系统找到插件的任何顺序显示它们。
但是,如果我想显示“PHP Mailer loaded”,那么在显示“Config / Settings management loaded”之前,我应该做的就是将PHP Mailer插件优先级降低到40。
答案 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;
// ...
}
}
这对你有用吗?