2010-05-31 67 views
4

我想对一个对象的属性进行排序,以便我可以按照定义的顺序遍历它们。php对象的排序属性

例如:我有一个对象'book',它具有以下属性:'id','title','author','date'。

现在我想通过这些属性这样的循环:

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

现在循环的顺序必须是“标题”,然后“作家”,“日”和“身份证”

如何做到这一点? (我无法更改对象类中属性的顺序,因为没有定义任何属性,我使用'MyActiveRecord'从数据库中获取对象)

回答

8

不确定这是否回答您的问题,但你可以尝试:

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

或者,你可以提取本书的性质(而不是硬编码),并且把它们与你的客户订单进行排序:

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

好了THX,我去物业的阵列,并通过他们的循环,似乎是最简单的答案给我;) – user324107 2010-05-31 10:54:06

4

你可以换你的源反对成某事实现Iterator interface并以给定的排序顺序返回源对象的属性。

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

打印

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

要复杂得多我的答案,但更智能和可重复使用的面向对象的。 +1 – mexique1 2010-05-31 10:54:17

+0

也比你的版本慢。 SPL不是所有PHP版本中最快的枪支;-) – VolkerK 2010-05-31 10:57:39

2

试试这个。这种方法和在该第一响应提出的方法之间的区别是,该方法get_class_vars返回默认类的特性,而get_object_vars返回给出对象的属性。

<?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

这并未达到要求的订单。 – 2016-06-22 16:43:53