【问题标题】:scandir for files for users用户文件的scandir
【发布时间】:2014-07-14 02:48:41
【问题描述】:

我已经为我的内容管理系统创建了一个页面仪表板,并且我正在尝试迭代 scandir 方法并且我的条件不起作用。谁能解释一下原因?

$pages = scandir('../',0);
foreach($pages as $page){
  if($page !== "." OR $page !== ".." OR $page !== "admin" OR $page !== "admin.php" OR $page !== "kms_kontent" OR !is_dir('../'.$page)){
        $extension = explode('.',$page);
        $extension = end($extension);
        $page = str_replace('.'.$extension,'',$page);
     echo '<div class="row"><ul><li class="fifths">'.$page.'</li><li class="fifths"></li></ul></div>';
  }
}

它正在回显所有内容

--public_html
   -admin.php #don't show
   -admin #don't show
   -kms_content #don'tshow
   -index.php #show
   -shop.php #show

它还显示...,我也不想显示。

【问题讨论】:

  • 反转逻辑。使用&amp;&amp;
  • 呃!我认为它会通过条件测试每个OR&amp;&amp; 有效,所以我不打算争论!
  • 你应该使用数组来简化。
  • 嗯,真的没有看到简化的逻辑吗?这就是我正在测试的所有内容。

标签: php foreach scandir


【解决方案1】:

逻辑有问题。要了解原因,让我们假设您只有以下比较:

$page !== "." OR $page !== ".."

如果页面不是.或者如果页面不是..,则满足条件;如果页面是.,它将不等于..,反之亦然。换句话说,条件总是被满足。

您想要的是,仅当页面既不是. 也不是.. 时才满足条件;所以:

!($page === '.' || $page === '..')

遵循德摩根定律:

$page !== '.' && $page !== '..'

可以使用一组可能的值来进一步简化代码:

$invalid_pages = [".", "..", "admin", "admin.php", "kms_kontent"];

if (!in_array($page, $invalid_pages) && !is_dir('../'.$page)) {
}

【讨论】:

  • 天啊,只有当有办法在我所有的问题中标记你时,当我来到这里时,你似乎能够满足我正在寻找的东西,这不仅是一个答案,而且是为什么并实际了解。你帮我理解了!总是很高兴@Jack
【解决方案2】:
if (
    $page !== "." OR
    $page !== ".." OR
    $page !== "admin" OR
    $page !== "admin.php" OR
    $page !== "kms_kontent" OR
    !is_dir('../'.$page)
) {

因为您使用的是OR,所以当任何条件为真时,if 将变为真。因此,如果 $pageadmin 它将为 $page !== "admin" 错误,但对所有其他人都是正确的,它不会工作。您应该使用&amp;&amp;AND

但是,您可以使用数组稍微清理一下该代码。例如:

$filter = ['.', '..', 'admin', 'admin.php', 'kms_kontent'];
$pages = scandir('../', 0);
foreach ($pages as $page) {
    if (!in_array($page, $filter) && !is_dir("../$page")) {
        ...
    }
}

它做同样的事情,但代码看起来更干净,可以更轻松地添加更多项目。

【讨论】:

  • 从来不知道in_array 函数,特别是因为我是一名JS 开发人员,我们必须自己编写。我很惭愧,因为同样的逻辑适用于 JS 和 PHP 条件:/。谢谢哈文纳德
  • @EasyBB 在 JavaScript 中,您实际上可以使用 [].indexOf() 的实现 :)
  • 是的,但是为了兼容性操作,我编写了一个小的 inArray 函数。可以传递多个参数。我讨厌图书馆 :D 所以我不知道一个好的图书馆哈哈(没有)只是因为它们倾向于每个人的需要,而不仅仅是你当前的工作量,这可能是一个负面的回报。
【解决方案3】:

使用 AND 或 && 代替 OR!

【讨论】:

  • 你是对的,但是在发布答案时。我寻找的不仅仅是一个简单的答案,而是一个合乎逻辑的解释。以杰克斯的回答为例,它深入人心。那里有很多“给我这个代码”的人,我不是其中之一。我喜欢学习和学习!但是是的,在回答时请记住这一点,否则您很可能会被否决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-15
  • 2015-01-17
  • 1970-01-01
  • 1970-01-01
  • 2012-01-21
  • 2016-09-30
相关资源
最近更新 更多