2010-05-31 5 views
4

Je souhaite trier les propriétés d'un objet afin que je puisse les parcourir dans un ordre défini. Par exemple: J'ai un objet 'book' avec les propriétés suivantes: 'id', 'title', 'author', 'date'.Propriétés de tri php de l'objet

Maintenant, je veux faire une boucle à travers ces propriétés comme celle-ci:

foreach($book as $prop=>$val) 
//do something 

maintenant l'ordre de la boucle doit être « title », puis « auteur », « date » et « id »

Comment ferait-on cela? (Je ne peux pas changer l'ordre des propriétés dans la classe de l'objet parce qu'il n'y a pas de propriétés définies, j'obtiens l'objet de la base de données avec 'MyActiveRecord')

Répondre

8

Vous ne savez pas si cela répond à votre question , mais vous pouvez essayer:

$properties = array('title', 'author', 'date', 'id'); 
foreach ($properties as $prop) { 
    echo $book->$prop; 
} 

Sinon, vous pouvez extraire les propriétés du livre (au lieu de les coder en dur), et les trier avec votre commande personnalisée:

$props = get_class_vars(get_class($book)); 
uasort($props, 'my_properties_sorting_function'); 
+0

Ok thx, je suis allé pour la gamme de propriétés et en boucle à travers eux, me semble la réponse la plus simple;) – user324107

4

vous pouvez envelopper source objet en quelque chose qui implémente le Iterator interface et renvoie les propriétés de l'objet source dans un ordre de tri donné.

class Foo implements Iterator { 
    protected $src; 
    protected $order; 
    protected $valid; 

    public function __construct(/*object*/ $source, array $sortorder) { 
    $this->src = $source; 
    $this->order = $sortorder; 
    $this->valid = !empty($this->order); 
    } 
    public function current() { return $this->src->{current($this->order)}; } 
    public function key() { return key($this->order); } 
    public function next() { $this->valid = false!==next($this->order); } 
    public function rewind() { reset($this->order); $this->valid = !empty($this->order); } 

    public function valid() { return $this->valid; } 
} 

class Book { 
    public $id='idval'; 
    public $author='authorval'; 
    public $date='dateval'; 
    public $title='titleval'; 
} 


function doSomething($it) { 
    foreach($it as $p) { 
    echo ' ', $p, "\n"; 
    } 
} 

$book = new Book; 
echo "passing \$book to doSomething: \n"; 
doSomething($book); 

$it = new Foo($book, array('title', 'author', 'date', 'id')); 
echo "passing \$it to doSomething: \n"; 
doSomething($it); 

impressions

passing $book to doSomething: 
    idval 
    authorval 
    dateval 
    titleval 
passing $it to doSomething: 
    titleval 
    authorval 
    dateval 
    idval 
+0

beaucoup plus compliqué que ma réponse, mais beaucoup plus, intelligent et réutilisable orienté objet. +1 – mexique1

+0

et aussi plus lent que votre version. Le SPL n'est pas le pistolet le plus rapide dans toutes les terres de PHP ;-) – VolkerK

2

essayer. La différence entre ce procédé et la méthode proposée dans la première réponse est que la méthode get_class_vars retourne défaut propriétés de la classe, alors que get_object_vars renvoie les propriétés de l'objet donné.

<?php 

class Book { 
    public $title; 
    public $author; 
    public $date; 
    public $id; 
} 

    $b = new Book(); 
    $b->title = "title"; 

    $object_vars = get_object_vars($b); 
    ksort($object_vars); 

    foreach($object_vars as $prop=>$val) 
     echo $prop."->".$val."<br>"; 

?> 
+0

Ceci n'atteint pas l'ordre demandé. –