2013-01-22 3 views
14

SQL 결과를 반복 가능한 객체로 반환하는 PHP 프레임 워크를 사용하고 있습니다. 문제는 하나의 행을 반환하는 SQL 쿼리를 가지고 있으며 첫 번째이자 유일한 요소를 얻기 위해 foreach -loop을 생성하지 않으려는 것입니다.이터레이터의 첫 번째 요소에 액세스하는 방법은 무엇입니까?

그럼 어떻게해야합니까?

이 작동하지 않습니다 :

$obj->item(0)->propName; 
$obj->next()->propName; 
$obj[0]->propName; 

어떤 아이디어? "반복 가능한"에 의해 가정

+3

'$를 OBJ>() -> propName' 아마? – Crisp

+2

'var_dump '를 넣고 결과 객체의 구조를 확인하십시오 –

+0

파삭 파삭의 대답이 트릭을 만들었습니다. 그 대답을 sep로 만들면 대답으로 표시됩니다. var_dump는 다음과 같이 쓸모없는 쓰레기를주었습니다 : http://pastebin.com/GeNDbiN4 – neubert

답변

13

, 당신은 객체가 Iterator interface를 구현하는 것을 의미합니다, 당신은 너무 $obj->current()->propName 당신이 원하는 아마, 현재의 요소를 검색 할 $obj->current()를 사용할 수 있습니다. (이 포인터를 재설정하지 않는 foreach에 사용 된 경우)

반복자 포인터가 이동 된 경우에, 당신은 당신이 $obj->current()를 호출하기 전에 첫 번째 요소로 다시 포인터를 설정하는 $obj->rewind()를 호출 할 수 있습니다 . (다른 그들 중 하나를 구현해야합니다 ) IteratorIteratorAggregate :

6

는 통과 할 수 있습니다 만 클래스 인터페이스가 있습니다.


반복자

다음과 같이 반복자의

첫 번째 요소를 얻을 수있다 :

$iterator->rewind(); 
if (!$iterator->valid()) { 
    throw new Exception('There is no any element!'); 
} 
$firstElement = $iterator->current(); 

확신하는 경우

  • $iterator, foreach에 의해 통과 된 적이 않았거나 루프가 멈추지 않았다면 break;
  • $iterator->next();

당신이 앞의 예에서 $iterator->rewind();를 생략 할 수 있습니다이라고 적이있다.

$iterator의 요소 수가 이 아니고이 아니라고 확신하는 경우 $iterator->valid() 테스트 조건 블록을 생략 할 수도 있습니다. 이러한 이전 조건은 당신이 필요 후 보존 그렇다면

은 다음과 같습니다

$firstElement = $iterator->current(); 

IteratorAggregate

당신은 어떤 단순히 첫 번째 요소를 얻을 수 없습니다. IteratorAggergate는 실제로 Iterator 나 다른 IteratorAggregate의 봉투 일뿐입니다. 논리적으로 이것은 끝에 반복자가 있음을 의미합니다. 불행히도 얼마나 많은 레벨이 깊은 지 알 수 없습니다.

첫 번째 요소를 달성하는 가장 간단한 방법은 다음과 같습니다

$array = iterator_to_array($iteratorAggregate); 
if (count($array) === 0) { 
    throw new Exception('There is no any element!'); 
} 
$firstElement = reset($array); 

(!하고 놀라 울 정도로 정확히 같은 솔루션은 반복자에 대해서도 작동)

우리는 일반 배열로 변환하는

다음 절차는 usual way to fetch the first element from an array입니다. 불행히도 biig 배열의 경우 이것은 약간 과도한입니다. 왜냐하면 우리는 하나만 필요하지만 모든 요소의 복사본을 만들어야하기 때문입니다.

는 느슨한 것 같다 하나 개의 솔루션이있다 :

while ($iteratorAggregate instanceof \IteratorAggregate) { 
    $iteratorAggregate = $iteratorAggregate->getIterator(); 
} 
$iterator = $iteratorAggregate; 

과는 매우 첫 번째 예에서 반복자처럼 다음 단계에서 우리는 함께 작동합니다. 나는 10000 명의 회원을위한 간단한 벤치 마크를 만들었으며이 솔루션은 거의 6 배 더 빠릅니다. 현재

LLAP

관련 문제