php - 将额外参数传递给 usort 回调

标签 php wordpress callback usort

我有以下功能。 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/

相关文章:

javascript - php echo jQuery点击问题

javascript - 使用 jquery 使用 twig 值填充输入字段

mysql - 需要一些帮助来调试这个 PHP

php - WordPress - AMP 错误 |标记 'style amp-custom' 中的 CSS 语法错误 - 在规则 '@import' 处看到无效

javascript - 使用事件对象的嵌套 FileReader onload 函数的回调

python - 如何在 Python 中创建 CFuncType

php - 使用 Laravel 在 Docker Mysql 上连接被拒绝

php - WooCommerce 结账卡在加载中

javascript - JS如何判断何时调用回调函数?

php - 更新帖子条款