7
votes

Fonction de tri PHP pour trier un tableau d'objets

J'ai un tableau rempli d'objets de la même classe. Je voudrais trier ce tableau par champ objet en option, par exemple $ cas-> ID code> ou $ cas-> expéditeur code>

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>

    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;
    }


2 commentaires

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".


5 Réponses :


7
votes

Vous pouvez utiliser Usort comme:

usort($arrayOfObjects, function($a, $b) {
        return $a->ID - $b->ID;
    });


1 commentaires

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)




0
votes

Vous devez jeter un coup d'œil à la fonction USort (). Il accepte un rappel qui fait le tri sur mesure, ce que vous voulez.


0 commentaires

10
votes

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


2 commentaires

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



0
votes

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 dans le rappel de tri.


0 commentaires