valores retornar retornan referencia que por parametros funciones ejemplos array php wordpress callback usort

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");''));