2010-05-31 8 views
4

정의 된 순서로 반복 할 수 있도록 객체의 속성을 정렬하고 싶습니다.객체의 PHP 정렬 속성

예를 들어 'id', 'title', 'author', 'date'속성을 가진 'book'개체가 있습니다.

지금 나는이 같은 이러한 속성을 반복하고 싶지 : 이제 루프의 순서가 '제목'다음 '저자', '날짜'와 'ID'

을 수있다
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

좋아 들으, 나는 속성의 배열에 들어갑니다 그들을 통해 반복, 나에게 가장 간단한 대답을 보인다) – 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

이보십시오. 이 방법 및 상기 제 1 응답에 제안 된 방법과의 차이점은 주어진 객체의 속성을 반환get_object_vars 반면 을 기본 클래스의 속성을 반환있어서 get_class_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

이것은 요청한 명령을 성취하지 못합니다. –

관련 문제