retornan - retornar valores de php a html
Pasar parámetros adicionales a la devolución de llamada de la orden (5)
Tengo las siguientes funciones. Funciones de Wordpress, pero esta es realmente una pregunta PHP. artist_lastname
mis objetos de $term
acuerdo con la propiedad artist_lastname
en los metadatos de cada objeto.
Quiero pasar una cadena en $meta
en la primera función. Esto me permitiría reutilizar este código ya que podría aplicarlo a varias propiedades de metadatos.
Pero no entiendo cómo puedo pasar parámetros adicionales a la devolución de llamada de usort. Traté de hacer una función anónima de estilo JS, pero la versión de PHP en el servidor es demasiado antigua y arrojó un error de sintaxis.
Cualquier ayuda, o un empujón hacia la esquina derecha del manual, se agradece. ¡Gracias!
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);
}
Asumiendo que tiene acceso a objetos y estática (PHP 5 o superior), puede crear un objeto y pasar los argumentos directamente allí, así:
<?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''));
Suponiendo que no tiene acceso a objetos / estática; podrías hacer un global:
$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'');
Creo que esta pregunta merece una actualización. Sé que la pregunta original era para la versión 5.2 de PHP, pero vine aquí en busca de una solución y encontré una para las versiones más nuevas de PHP y pensé que esto también podría ser útil para otras personas.
Para PHP 5.3 y posteriores, puede usar la palabra clave '' use '' para introducir variables locales en el ámbito local de una función anónima. Entonces, lo siguiente debería funcionar:
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);
});
}
Un código más general
Si desea ordenar una matriz solo una vez y necesita un argumento adicional, puede usar una función anónima como esta:
usort($arrayToSort, function($a, $b) use ($myExtraArgument) {
//$myExtraArgument is available in this scope
//perform sorting, return -1, 0, 1
return strcmp($a, $b);
});
Si necesita una función reutilizable para ordenar una matriz que necesita un argumento adicional, siempre puede ajustar la función anónima, al igual que para la pregunta original:
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);
});
}
En PHP, una opción para una callback es pasar una matriz de dos elementos que contiene un identificador de objeto y un nombre de método para invocar el objeto. Por ejemplo, si $obj
era una instancia de la clase MyCallable
, y desea llamar al método MyCallable
de MyCallable
en $obj
, entonces puede pasar array($obj, "method1")
como devolución de llamada.
Una solución que utiliza este tipo de devolución de llamada compatible es definir una clase de uso único que esencialmente actúa como un tipo de cierre:
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);
}
}
Esto no te ayudará en absoluto con usort()
pero podría ser útil sin embargo. Puede ordenar la matriz usando una de las otras funciones de clasificación, array_multisort()
.
La idea es crear una matriz de los valores que ordenaría (los valores de retorno de get_term_meta()
) y multisortarlos contra su arreglo principal de $terms
.
function sort_by_term_meta(&$terms, $meta)
{
$sort_on = array();
foreach ($terms as $term) {
$sort_on[] = get_term_meta($term->term_id, $meta, true);
}
array_multisort($sort_on, SORT_ASC, SORT_STRING, $terms);
}
Los documentos dicen que create_function()
debería funcionar en PHP> = 4.0.1. ¿Esto funciona?
function term_meta_cmp( $a, $b, $meta ) {
echo "$a, $b, $meta<hr>"; // Debugging output
}
$terms = array("d","c","b","a");
usort($terms, create_function(''$a, $b'', ''return term_meta_cmp($a, $b, "some-meta");''));