2016-03-20 5 views
2

Когда я итерацию по структуре папок -энный элемент итератора

$it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory)); 

- есть способ получить на п-й элемент в полученном итератора ($it) непосредственно, то есть без зацикливания и без преобразования его в массив сначала (например, используя iterator_to_array())?

+0

Поскольку итератор вполне может быть генератором (как правило, все, что составляет его данные по мере его поступления, а не итерирование существующей структуры данных в памяти) ... нет. – deceze

+0

10 @deceze Ах, я вижу, поэтому код в моем вопросе выполняется так чертовски быстро - он вообще не выполняется, пока я не попытаюсь что-то с ним сделать. –

+0

Да, точно, код в вашем вопросе на самом деле ничего не делает. – deceze

ответ

0

Поскольку это, кажется, ответ, который вы ищете, перепроведении мой комментарий как ответ:

Поскольку итератор вполне может быть генератор (все, что делает свои данные, это происходит, а не просто повторение чего-то в памяти): нет, вы не можете напрямую перейти к определенному «индексу». Вы должны итерировать итератор, чтобы получить конкретный фрагмент данных, который вы хотите.

0

Вы можете сделать это с помощью цикла while и методов и valid(). Просто используйте счетчик и перейдите к следующему элементу, пока не нажмете нужный. В конце вам просто нужно убедиться, что он по-прежнему действителен.

$element = 3; 
$elementCount = 0; 

$it->rewind(); 
while($elementCount < $element) { 
    $it->next(); 
    $elementCount++; 
} 


if($it->valid()) 
    echo $it->current(); 
} 
+0

Прошу прощения, если это было неясно, но «прямо» в моем вопросе означает, что я не хочу зацикливаться, потому что цикл занимает время (мой итератор составляет 300000 элементов). Я отредактирую свой вопрос, чтобы сделать это более понятным. –

+1

@what Непосредственно нет. Поскольку это итератор, он просматривает данные и * итерации * над ним. Таким образом, он не может напрямую прыгать. – Rizier123

+0

Спасибо, я думаю, что начинаю понимать. Итератор только начинает выполнять свою работу, когда я пытаюсь что-то сделать с результатом итерации. До этого результата пока не существует. –