#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. Спасибо! Хотя я читал руководство, я не смог перейти этот мост. Теперь, когда вы даете мне контекст, это правдоподобно. Я несколько раз сталкивался с подобной концепцией. Теперь кажется, что вы подводите меня гораздо ближе к сути.