Puede utilizar no solo una función anónima sino un cierre, como p. Ej.
function ($a,$b) use ($sort) { ... }
y $ sort estará disponible en el cuerpo de la función. autónomo ejemplo:
<?php
function getFn($sort) {
return function($a, $b) use($sort) {
if($a->$sort > $b->$sort) return 1;
if($a->$sort < $b->$sort) return -1;
return 0;
};
}
$abuseCases = array(
(object)array('ID'=>1, 'Sender'=>'Sender A'),
(object)array('ID'=>3, 'Sender'=>'Sender D'),
(object)array('ID'=>2, 'Sender'=>'Sender C'),
(object)array('ID'=>4, 'Sender'=>'Sender B')
);
echo "\n----- Sort By Sender ----\n";
usort($abuseCases, getFn('Sender'));
foo($abuseCases);
echo "\n----- Sort By ID ----\n";
usort($abuseCases, getFn('ID'));
foo($abuseCases);
function foo($a) {
foreach($a as $o) {
echo $o->ID, ' ', $o->Sender, "\n";
}
}
impresiones
----- Sort By Sender ----
1 Sender A
4 Sender B
2 Sender C
3 Sender D
----- Sort By ID ----
1 Sender A
2 Sender C
3 Sender D
4 Sender B
actualización: < con PHP 5.3 que puede utilizar un objeto en lugar de una función anónima. usort() espera que el segundo parámetro sea callable
. Esa puede ser una función anónima a partir de php 5.3, pero también puede ser el nombre de una función ... o un objeto y un nombre de método pasados como una matriz como array($obj, 'methodName')
.
$abuseCases = getData();
echo "\n----- Sort By Sender ----\n";
usort($abuseCases, array(new Foo('Sender'), 'compare'));
foo($abuseCases);
echo "\n----- Sort By ID ----\n";
usort($abuseCases, array(new Foo('ID'), 'compare'));
foo($abuseCases);
class Foo {
public $propName; // protected?
public function __construct($propertyName) {
$this->propName = $propertyName;
}
public function compare($a, $b) {
$prop = $this->propName;
if($a->$prop > $b->$prop) return 1;
if($a->$prop < $b->$prop) return -1;
return 0;
}
}
function foo($a) {
foreach($a as $o) {
echo $o->ID, ' ', $o->Sender, "\n";
}
}
function getData() {
return array(
(object)array('ID'=>1, 'Sender'=>'Sender A'),
(object)array('ID'=>3, 'Sender'=>'Sender D'),
(object)array('ID'=>2, 'Sender'=>'Sender C'),
(object)array('ID'=>4, 'Sender'=>'Sender B')
);
}
(Si hace un uso intensivo de esto - o no quiere escribir excusas como ésta -_- - es posible que desee para definir una interfaz como interface Comparator { ... }
, dejar que Foo implementar esa interfaz y tienen alguna función/clase que usa Comparator, es decir, un contenedor para objetos alrededor de usort().)
¿Por qué falla? ¿Qué resultado estás viendo? – codaddict
En el primer intento, obviamente no se encontró $ sort. En el segundo intento, no sé cómo referirme a la función 'srt'. – Hubro