我已经为我的内容管理系统创建了一个页面仪表板,而且我正在尝试迭代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
此外,它还显示了我不想显示的.
和..
。
答案 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将成立。因此,如果$page
为admin
,则$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!