php сортировать свойства объекта - PullRequest
5 голосов
/ 31 мая 2010

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

например: у меня есть объект 'book' со следующими свойствами: 'id', 'title', 'author', 'date'.

Теперь я хочу просмотреть эти свойства следующим образом:

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

теперь порядок цикла должен быть «title», затем «author», «date» и «id»

Как можно это сделать? (Я не могу изменить порядок свойств в классе объекта, потому что там не определены никакие свойства, я получаю объект из базы данных с помощью 'MyActiveRecord')

Ответы [ 3 ]

8 голосов
/ 31 мая 2010

Не уверен, что это ответ на ваш вопрос, но вы можете попробовать:

$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');
4 голосов
/ 31 мая 2010

Вы можете заключить ваш исходный объект во что-то, что реализует интерфейс Iterator и возвращает свойства исходного объекта в заданном порядке сортировки.

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
3 голосов
/ 31 мая 2010

Попробуй это. Разница между этим методом и методом, предложенным в первом ответе, заключается в том, что метод get_class_vars возвращает default свойства класса, тогда как 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>";

?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...