J'ai un tableau rempli d'objets de la même classe. Je voudrais trier ce tableau par champ objet en option, par exemple y a-t-il une saveur intégrée de La fonction array_sort () qui fait déjà cela ou devrai-je écrire cette fonction de tri moi-même? p> réponse n'a pas à expliquer en détail - c'est plus comme une question oui / aucune question p > merci p> My Échec de l'USort: P> $ cas-> ID code> ou $ cas-> expéditeur code>
function sortBy($sort)
{
$this->sortBy = $sort;
usort($this->abuseCases, array("this", "srt"));
}
private function srt($a, $b)
{
if($a->{$this->sortBy} > $b->{$this->sortBy}) return 1;
if($a->{$this->sortBy} < $b->{$this->sortBy}) return -1;
else return 0;
}
5 Réponses :
Vous pouvez utiliser Usort comme:
usort($arrayOfObjects, function($a, $b) {
return $a->ID - $b->ID;
});
Merci pour la réponse. Connaissez-vous des méthodes d'obtention d'une variable prédéfinie dans cette fonction de tri? Ma tentative a échoué (je l'ai édité dans le poteau principal)
Vous devrez l'écrire, mais c'est assez trivial avec USort () code> A>: function my_obj_sort($a, $b) {
return strnatcasecmp($a->Sender, $b->Sender);
}
usort($cases, 'my_obj_sort');
Vous devez jeter un coup d'œil à la fonction USort (). Il accepte un rappel qui fait le tri sur mesure, ce que vous voulez. P>
Vous pouvez utiliser non seulement une fonction anonyme, mais une fermeture, comme par exemple,
$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')
);
}
Fonctionne parfaitement. Merci! S'il y a une version du même résultat qui nécessite moins de code j'aimerais aussi voir ça aussi: p
Désolé active Php 5.3 ne sera pas disponible - j'ai besoin d'une autre solution
de la conception POV Une meilleure option serait d'utiliser un objet dédié (comme cascollection) au lieu de tableaux simples. Vous pouvez faire des touches de tri un membre de cet objet et faites trivialement référence comme $ ceci-> sortkey code> dans le rappel de tri. p>
Pourquoi échoue-t-il? Quel résultat voyez-vous?
Dans la première tentative, $ Trier n'était évidemment pas trouvé. Dans la deuxième tentative, je ne sais pas comment se référer à la fonction "SRT".