Sie können nicht nur eine anonyme Funktion, sondern eine Schließung verwenden, wie z.
function ($a,$b) use ($sort) { ... }
und $ sort wird im Funktionskörper verfügbar sein. Autarke Beispiel:
<?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";
}
}
druckt
----- 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
aktualisieren: Mit PHP < 5.3 Sie ein Objekt statt einer anonymen Funktion verwenden können. usort() erwartet, dass der zweite Parameter ein callable
ist. Das kann eine anoymous Funktion wie von PHP 5.3 sein, aber es kann auch der Name einer Funktion sein .... oder ein Objekt und ein Methodenname, der als ein Array wie array($obj, 'methodName')
übergeben wird.
$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')
);
}
(Wenn Sie schweren Gebrauch machen - oder wollen nicht Ausreden wie diese schreiben -_- - Sie könnten eine Schnittstelle wie interface Comparator { ... }
, lassen Foo diese Schnittstelle implementieren und eine Funktion haben definieren wollen/Klasse, die Komparator verwendet, dh einen Wrapper für Objekte um usort().)
Warum scheitert es? Welches Ergebnis sehen Sie? – codaddict
Im ersten Versuch wurde $ sort offensichtlich nicht gefunden. Im zweiten Versuch weiß ich nicht, wie ich auf die Funktion 'srt' verweisen soll. – Hubro