php сортирует свойства объекта
Я хочу отсортировать свойства объекта, чтобы я мог просматривать их в определенном порядке.
Например: У меня есть объект "книга" со следующими свойствами: "идентификатор", "название", "автор", "дата".
Теперь я хочу просмотреть эти свойства следующим образом:
foreach($book as $prop=>$val)
//do something
Теперь порядок цикла должен быть "название", затем "автор", "дата" и "идентификатор"
Как бы это сделать? (Я не могу изменить порядок свойств в классе объекта, потому что там если там не определены какие-либо свойства, я получаю объект из базы данных с помощью "myactiverecord")
3 answers
Не уверен, что это ответ на ваш вопрос, но вы могли бы попробовать:
$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');
Вы можете обернуть свой исходный объект во что-то, что реализует интерфейс итератора и возвращает свойства исходного объекта в заданном порядке сортировки.
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
Попробуйте это. Разница между этим методом и методом, предложенным в первом ответе, заключается в том, что метод 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>";
?>