2013-02-17 5 views
4

배열과 같이 동작하는 개체 모음을 가진 개체가 있습니다. 그것은 데이터베이스 결과 객체입니다. 다음과 같은 예시 :PHP : ArrayAccess를 구현하는 객체 인 "배열"을 어떻게 정렬하고 필터링 할 수 있습니까?

$users = User::get(); 
foreach ($users as $user) 
    echo $user->name . "\n"; 

$users 변수 ArrayAccessCountable 인터페이스를 구현하는 것을 목적으로한다.

나는 정렬이 "배열"을 필터링하고 싶습니다

,하지만 난 그것에 배열 기능을 사용할 수 없습니다

$users = User::get(); 
$users = array_filter($users, function($user) {return $user->source == "Twitter";}); 
=> Warning: array_filter() expects parameter 1 to be array, object given 

어떻게 I 종류와 객체의 종류를 필터링 할 수 있습니다?

+0

user :: get() 함수가 배열을 반환하지 않는 것 같습니다. 배열 – Vineet1982

+2

을 반환합니다. 사용자 옵션에 "toArray"메서드를 구현하는 것이 가장 좋습니다. – Supericy

+0

ArrayAccess 및 Countable이 모든 요소를 ​​반복하는 데 충분하지 않은 경우에도 키를 알아야합니다. 필자의 의견으로는'User :: get()'을 조정하여 요청한 사용자 유형에 대한 추가 정보를 받아들이는 것이 길이다. 정렬 및 필터링과 같은 작업은 데이터 기반 작업이므로 데이터베이스에서 가장 잘 수행됩니다. – Niko

답변

8

수 없습니다. ArrayAccess 인터페이스의 목적은 배열에 대한 OOP 래퍼를 만드는 것뿐만 아니라 (종종 그런 용도로 사용되기도 함) 처음부터 모든 요소를 ​​모를 수도있는 컬렉션에 배열과 같은 액세스를 허용하기위한 것입니다. offsetGet()offsetSet()에서 원격 프로 시저를 호출하는 웹 서비스 클라이언트를 상상해보십시오. 임의의 요소에 액세스 할 수는 있지만 전체 모음에 액세스 할 수는 없습니다. 이는 ArrayAccess 인터페이스의 일부가 아닙니다.

객체는 (Iterator 또는 IteratorAggregate 통해) 배열은 적어도 (iterator_to_array가 작업을 수행) 정보로 구성 될 수 Traversable를 구현하는 경우. 하지만 당신은 여전히 ​​그것을 변환해야합니다, 네이티브 배열 함수 배열 허용.

개체가 데이터를 내부적으로 배열로 저장하는 경우 가장 효율적인 솔루션은 물론이 배열을 반환하는 toArray() 메서드를 구현하는 것입니다 (포함 된 개체에 대해 재귀 적으로 toArray()을 호출 할 수도 있음).