Цикл While без явного приращения / счетчика (базовый)

#php #loops #while-loop #conditional-statements #increment

#php #циклы #цикл while #условные операторы #увеличение

Вопрос:

Я новичок в 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);
  

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

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

Комментарии:

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

2. Поскольку циклу while не обязательно иметь инкрементное значение, пока есть что -то, что может прервать цикл, в данном случае это когда $file установлено значение false .

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

4. @NiyokoYuliawan: А, ладно, я подозревал что-то подобное. Интересно, почему в немецком руководстве по php это не упоминается. Это кажется слишком очевидным. Тем больше я благодарю вас за ваш импульс. Похоже на конструкцию выборки в контексте mysqli, которая также была волшебной для меня.

5. @Franz Спасибо. Передо мной три книги для начинающих, и они не закрывают переход от примера для начинающих к «внутренним указателям» и не читают руководство. Извините, если я отклонился от темы, вы мне очень помогли.

Ответ №1:

Как вы можете видеть в документации PHP readdir , делает:

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

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

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

  • one.txt
  • two.txt

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

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

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

Комментарии:

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