用户文件的scandir

时间:2014-07-14 02:48:42

标签: php foreach scandir

我已经为我的内容管理系统创建了一个页面仪表板,而且我正在尝试迭代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

此外,它还显示了我不想显示的...

3 个答案:

答案 0 :(得分:2)

逻辑是有缺陷的。为了了解原因,我们假设你只有这个比较:

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

如果页面不是.或页面不是..,则满足条件;如果页面为.,则不等于..,反之亦然。换句话说,条件总是得到满足。

您想要的是,只有当页面既不是.也不是..时,条件才会得到满足。这样:

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

遵循德摩根法律:

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

可以使用一系列可能的值来简化代码:

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

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

答案 1 :(得分:1)

if (
    $page !== "." OR
    $page !== ".." OR
    $page !== "admin" OR
    $page !== "admin.php" OR
    $page !== "kms_kontent" OR
    !is_dir('../'.$page)
) {

因为您使用的是OR,所以当任何条件为真时,if将成立。因此,如果$pageadmin,则$page !== "admin"将为false,但对其他所有人都为真,并且无效。您应该使用&&AND

但相反,你可以使用数组清理一下代码。例如:

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

它做同样的事情,但代码看起来更干净,更容易添加更多项目。

答案 2 :(得分:0)

使用AND或&amp;&amp;而不是OR!