djb*_*djb 38 php wordpress callback usort
我有以下功能.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);
}
Run Code Online (Sandbox Code Playgroud)
Bas*_*Bas 83
我认为这个问题值得更新.我知道最初的问题是针对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);
});
}
Run Code Online (Sandbox Code Playgroud)
如果你只想对一个数组进行排序并需要一个额外的参数,你可以使用这样的匿名函数:
usort($arrayToSort, function($a, $b) use ($myExtraArgument) {
//$myExtraArgument is available in this scope
//perform sorting, return -1, 0, 1
return strcmp($a, $b);
});
Run Code Online (Sandbox Code Playgroud)
如果您需要一个可重用的函数来对需要额外参数的数组进行排序,您可以始终包装匿名函数,就像原始问题一样:
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);
});
}
Run Code Online (Sandbox Code Playgroud)
Dan*_*ien 23
在PHP中,回调的一个选项是传递包含对象句柄和方法名称的双元素数组以在对象上调用.例如,如果$obj是类的实例MyCallable,并且您想要调用on 的method1方法,那么您可以作为回调传递.MyCallable$objarray($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);
}
}
Run Code Online (Sandbox Code Playgroud)
假设您可以访问对象和静态(PHP 5或更高版本),您可以创建一个对象并直接在那里传递参数,如下所示:
<?php
class SortWithMeta {
private static $meta;
static function sort(&$terms, $meta) {
self::$meta = $meta;
usort($terms, array("SortWithMeta", "cmp_method"));
}
static function cmp_method($a, $b) {
$meta = self::$meta; //access meta data
// do comparison here
}
}
// then call it
SortWithMeta::sort($terms, array('hello'));
Run Code Online (Sandbox Code Playgroud)
假设您无权访问对象/静态; 你可以做一个全球性的:
$meta = array('hello'); //define meta in global
function term_meta_cmp($a, $b) {
global $meta; //access meta data
// do comparison here
}
usort($terms, 'term_meta_cmp');
Run Code Online (Sandbox Code Playgroud)