Iterator
Pierwszy element Iterator można uzyskać w następujący sposób:
$iterator->rewind();
if (!$iterator->valid()) {
throw new Exception('There is no any element!');
}
$firstElement = $iterator->current();
Jeżeli jesteś pewien:
$iterator
nigdy nie został poprzecinany foreach
lub jeśli tak, ale pętla nigdy nie została zatrzymana z break;
- nigdy nie nazwano
$iterator->next();
można pominąć $iterator->rewind();
z poprzedniego przykładu.
Jeżeli jesteś pewien, że liczba elementów w $iterator
jest nie zero, można nawet pominąć bloku testowanie stanu $iterator->valid()
.
Więc jeśli te wcześniejsze warunki są zachowane, to co trzeba to po prostu:
$firstElement = $iterator->current();
IteratorAggregate
Nie można uzyskać pierwszy element dowolny po prostu. IteratorAggergate jest właściwie tylko kopertą dla Iteratora lub innego IteratorAggregate. Logicznie oznacza to, że na końcu znajduje się Iterator. Niestety nie wiesz, ile poziomów jest głębokich.
Najprostszym sposobem na osiągnięcie pierwszego elementu jest:
$array = iterator_to_array($iteratorAggregate);
if (count($array) === 0) {
throw new Exception('There is no any element!');
}
$firstElement = reset($array);
(! I zaskakująco dokładnie to samo rozwiązanie działa również na Iterator)
Jesteśmy przekształcenie go do zwykłej tablicy więc następna procedura to usual way to fetch the first element from an array. Niestety w przypadku tablicy biigowej jest to trochę przesada, ponieważ kopia wszystkich elementów musi zostać utworzona, mimo że potrzebujemy tylko jednego.
Jest jedno rozwiązanie, które wydaje się niedbały:
while ($iteratorAggregate instanceof \IteratorAggregate) {
$iteratorAggregate = $iteratorAggregate->getIterator();
}
$iterator = $iteratorAggregate;
aw następnym kroku będziemy pracować z nim, jakby to było iterację w pierwszym przykładzie. Zrobiłem prosty test porównawczy dla tablicy liczącej 10000 członków, a to rozwiązanie było prawie 6 razy szybsze.
LLAP
'$ obj-> current() -> propName' może? – Crisp
wstaw 'var_dump' i sprawdź strukturę obiektu wynikowego –
Odpowiedź Crispa rozwiązała problem. Stwórz odpowiedź sep i zaznaczę ją jako odpowiedź. var_dump dał mi bezużyteczne śmieci takie jak to: http://pastebin.com/GeNDbiN4 – neubert