PHP使用usort对WordPress标签对象数组按slug排序失效问题
问题核心原因
PHP函数作用域限制,你定义的$tagPriorityMap属于全局变量,默认情况下函数内部无法直接访问全局作用域的变量,sort_tags函数内读取的$tagPriorityMap是未定义的局部变量,因此无法返回对应值。
修复方案
推荐优先使用第一种方案,避免全局变量污染:
- 方法1:使用匿名函数作为回调,通过
use关键字引入优先级映射数组(PHP 5.3及以上版本支持)
$tagPriorityMap = array( "research" => 0, "strategy" => 1, "naming" => 2, "identity" => 3, "packaging" => 4, "environment" => 5, "digital" => 6, ); // $yourTagsArray替换为你实际要排序的标签数组变量名 usort($yourTagsArray, function ($a, $b) use ($tagPriorityMap) { // 加??999是为了处理slug不在优先级映射里的情况,避免报错,不在列表的标签会统一排在最后 $aPriority = $tagPriorityMap[$a->slug] ?? 999; $bPriority = $tagPriorityMap[$b->slug] ?? 999; if ($aPriority == $bPriority) { return 0; } return $aPriority < $bPriority ? -1 : 1; });
- 方法2:在自定义函数内用
global关键字声明引入全局变量(不推荐,全局变量易被意外修改引发问题)
$tagPriorityMap = array( "research" => 0, "strategy" => 1, "naming" => 2, "identity" => 3, "packaging" => 4, "environment" => 5, "digital" => 6, ); function sort_tags($a, $b) { global $tagPriorityMap; $aPriority = $tagPriorityMap[$a->slug] ?? 999; $bPriority = $tagPriorityMap[$b->slug] ?? 999; if ($aPriority == $bPriority) { return 0; } return $aPriority < $bPriority ? -1 : 1; } usort($yourTagsArray, 'sort_tags');
内容的提问来源于stack exchange,提问作者Matt Anderson
相关产品推荐
相关产品推荐

