2010-05-31 5 views
4

Я хочу сортировать свойства объекта, чтобы я мог прокручивать их в определенном порядке.Свойства сортировки php объекта

например: У меня есть «книга» объекта со следующими свойствами: «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

Ok ТНХ, я пошел в массив свойств и перекручивание через них, кажется, самый простой ответ на меня;) – user324107

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

+0

, а также медленнее, чем ваша версия. SPL - это не самый быстрый пистолет на всей площадке PHP ;-) – VolkerK

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

Это не соответствует запрошенному заказу. –

Смежные вопросы