一尘不染

将额外的参数传递给usort回调

php

我有以下功能。WordPress功能,但这实际上是一个PHP问题。它们$term根据artist_lastname每个对象的元数据中的属性对我的对象进行排序。

我想$meta在第一个函数中传递一个字符串。这将使我可以重复使用此代码,因为我可以将其应用于各种元数据属性。

但是我不明白如何将 额外的 参数传递给usort回调。我试图制作一个JS风格的匿名函数,但是服务器上的PHP版本太旧,并引发了语法错误。

非常感谢您提供的任何帮助-或将手册推向手册的右上角。谢谢!

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); 
}

阅读 262

收藏
2020-05-29

共1个答案

一尘不染

在PHP中,回调的一种选择是传递一个包含对象句柄和方法名称的,由两个元素组成的数组,以对该对象进行调用。例如,如果$obj是class的实例MyCallable,并且您要调用on
method1方法,则可以将其作为回调传递。MyCallable``$obj``array($obj, "method1")

使用此受支持的回调类型的一种解决方案是定义一个单用类,该类本质上类似于闭包类型:

function sort_by_term_meta( $terms, $meta ) 
{
    usort($terms, array(new TermMetaCmpClosure($meta), "call"));
}

function term_meta_cmp( $a, $b, $meta )
{
    $name_a = get_term_meta($a->term_id, $meta, true);
    $name_b = get_term_meta($b->term_id, $meta, true);
    return strcmp($name_a, $name_b); 
}

class TermMetaCmpClosure
{
    private $meta;

    function __construct( $meta ) {
        $this->meta = $meta;
    }

    function call( $a, $b ) {
        return term_meta_cmp($a, $b, $this->meta);
    }
}
2020-05-29