我有以下功能。 WordPress 功能,但这确实是一个 PHP 问题。他们根据每个对象元数据中的 artist_lastname
属性对我的 $term
对象进行排序。
我想在第一个函数中将字符串传递给 $meta
。这可以让我重用此代码,因为我可以将其应用于各种元数据属性。
但我不明白如何将 extra 参数传递给 usort 回调。我试图制作一个 JS 风格的匿名函数,但服务器上的 PHP 版本太旧(v. 5.2.17)并引发了语法错误。
任何帮助 - 或推到手册的右角 - 非常感谢。谢谢!
function sort_by_term_meta($terms, $meta)
{
usort($terms,"term_meta_cmp");
}
function term_meta_cmp( $a, $b )
{
$name_a = get_term_meta($a->term_id, 'artist_lastname', true);
$name_b = get_term_meta($b->term_id, 'artist_lastname', true);
return strcmp($name_a, $name_b);
}
PHP 版本:5.2.17
最佳答案
我认为这个问题值得更新。我知道最初的问题是针对 PHP 5.2 版的,但我来这里是为了寻找解决方案,并找到了适用于较新版本 PHP 的解决方案,并认为这可能对其他人也有用。
对于 PHP 5.3 及更高版本,您可以使用“use”关键字将局部变量引入匿名函数的局部范围。所以下面应该工作:
function sort_by_term_meta(&$terms, $meta) {
usort($terms, function($a, $b) use ($meta) {
$name_a = get_term_meta($a->term_id, 'artist_lastname', true);
$name_b = get_term_meta($b->term_id, 'artist_lastname', true);
return strcmp($name_a, $name_b);
});
}
一些更通用的代码
如果你只想对数组排序一次并且需要一个额外的参数,你可以使用这样的匿名函数:
usort($arrayToSort, function($a, $b) use ($myExtraArgument) {
//$myExtraArgument is available in this scope
//perform sorting, return -1, 0, 1
return strcmp($a, $b);
});
如果您需要一个可重用的函数来对需要额外参数的数组进行排序,您总是可以包装匿名函数,就像原始问题一样:
function mySortFunction(&$arrayToSort, $myExtraArgument1, $myExtraArgument2) {
usort($arrayToSort, function($a, $b) use ($myExtraArgument1, $myExtraArgument2) {
//$myExtraArgument1 and 2 are available in this scope
//perform sorting, return -1, 0, 1
return strcmp($a, $b);
});
}
关于php - 将额外参数传递给 usort 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8230538/