2016-10-24 3 views
0

Я новичок в php, и это мой первый язык. Поэтому мой вопрос кажется очень простым.Хотя цикл без явного приращения/счетчика (базовый)

Сначала основная концепция цикла while кажется мне довольно понятной. Пока я увеличиваю (i ++) до тех пор, пока не станет «аварийным» (i < 10).

Но я действительно удивляюсь, почему работает следующий пример кода без какого-либо явного приращения.

$originals = "originale"; 
$thumbnails="thumbnails"; 
$directory = opendir($originale); 
$images = array(); 
while(($file = readdir($directory)) !== false) { 
    if(preg_match("/\.jp?g$/i", $file)){ 
     $images[] = $file; 
    } 
} 
echo "<pre>"; 
var_dump($images); 
echo "</pre>"; 
closedir($directory); 

Очевидно, что я что-то пропустил. Кажется, это волшебство. Я бы ожидал цикл без энтузиазма, который возвращает первый файл ...?

Я надеюсь, что, несмотря на мой английский (извините за это), вопрос становится понятным. Большое спасибо заранее.

+2

'while'-loops run * while * условие внутри их фигурных скобок истинно. условие в этом случае равно '($ file = readdir ($ directory))', который пытается назначить новое имя файла из каталога в $ file и - в целом - возвращает false, если нет нового доступного файла. ** но: ** объяснение базового кода довольно не по теме для SO - это не учебный сайт. [поисковая система по вашему выбору] предоставляет немало, которые лучше подходят для ваших нужд. –

+1

Поскольку в цикле нет необходимости иметь инкрементное значение, пока существует _something_, чтобы разбить цикл, в этом случае значение '$ file' равно false. – Epodax

+1

readdir будет продвигать указатель, и если указатель достигнет конца каталога, он вернет false. –

ответ

2

Как вы можете видеть в PHP documentationreaddir делает:

Возвращает имя следующего входа в каталоге. Записи возвращаются в том порядке, в котором они хранятся в файловой системе.

Таким образом, каждый раз, когда вы вызываете readdir, будет возвращен следующий файл из этого каталога.

Например, если у вас есть direcotry с 2 файлов:

  • one.txt
  • two.txt

Первый раз, когда вы звоните readdir возвратит one.txt. И это отличается от false так будет выполнять код внутри while

Второй раз, когда вы звоните readdir возвратит two.txt и то же, как описано выше.

Сокращение времени, которое вы вызываете readdir, вернет false, потому что больше нет файлов в этом цирке. и условие от while больше не будет правдой, поэтому больше не будет вводить.

+0

Спасибо! Хотя я прочитал руководство, я не смог пройти через этот мост. Теперь, когда вы даете мне контекст, это правдоподобно. Я несколько раз сталкивался с подобной концепцией. Теперь кажется, что вы приближаете меня ближе к делу. –

Смежные вопросы