【问题标题】:While loop without explicit increment / counter (basic)没有显式增量/计数器的while循环(基本)
【发布时间】:2017-03-06 00:22:35
【问题描述】:

我是 php 新手,它是我的第一语言。所以我的问题似乎很基础。

首先,while 循环的基本概念对我来说似乎很清楚。 只要 i 递增 (i++) 直到“崩溃条件”(i

但我真的想知道为什么下面没有任何显式增量的代码示例有效。

$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);

显然我错过了一些东西。这似乎是魔法。我希望有一个循环返回第一个文件...?

我希望尽管我的英语(对不起)问题变得清晰。 提前谢谢了。

【问题讨论】:

  • while-loops 运行 while 括号内的条件为真。在这种情况下,条件是($file = readdir($directory)),它尝试将新文件名从目录分配给 $file,并且 - 作为一个整体 - 如果没有可用的新文件,则返回 false。 但是: 基本代码的解释对于 SO 来说是完全偏离主题的——这不是一个教程网站。 [您选择的搜索引擎] 提供了相当多的内容,应该更适合您的需求。
  • 因为 while 循环不需要有增量值,只要有 something 来打破循环,在这种情况下它是 $file 设置为假的。
  • readdir 将指针前进,如果指针到达目录末尾,则返回false。
  • @NiyokoYuliawan:啊,好吧,我怀疑是这样的。想知道为什么德国 php-manual 没有提到它。这似乎太明显了。我越是感谢你的冲动。似乎类似于 mysqli 上下文中的 fetch 构造,这对我来说也很神奇。
  • @Franz 谢谢。我面前有三本初学者书籍,它们没有关闭从初学者示例到“内部指针”的桥梁并阅读手册。对不起,如果我跑题了,你帮了我很多。

标签: php loops while-loop conditional-statements increment


【解决方案1】:

正如您在PHP documentation readdir 中看到的那样:

返回目录中下一个条目的名称。这些条目按照文件系统存储它们的顺序返回。

所以每次调用readdir 都会返回该目录中的下一个文件。

例如,如果您有一个包含 2 个文件的目录:

  • one.txt
  • two.txt

第一次调用readdir 将返回one.txt。这和false不同,所以会执行while里面的代码

第二次调用readdir会返回two.txt,和上面一样。

第三次调用readdir 将返回false,因为该目录中没有更多文件。并且来自while 的条件将不再为真,因此不再输入。

【讨论】:

  • 谢谢!尽管我阅读了手册,但我无法通过那座桥。既然你给了我上下文,那是合理的。我多次遇到类似的概念。现在看来你让我更接近重点了。
猜你喜欢
  • 1970-01-01
  • 2019-03-09
  • 1970-01-01
  • 2011-06-19
  • 1970-01-01
  • 2011-10-13
  • 2017-06-19
  • 2016-04-02
  • 1970-01-01
相关资源
最近更新 更多