使用PHP在assoc数组中使用按钮名称筛选表



我试图实现的目标

我目前得到了一个巨大的集合,其中有1000多行和10多列,用PDO解析成一个表。之后有必要对表进行过滤,我决定使用PHP来完成这项工作。

我目前的方法运行良好,但我不确定它是否在性能方面效率较低,因为有很多else if语句会使代码看起来很乱。

我当前的方法

我得到了一个"过滤表">HTML按钮,它打开一个弹出窗口,在表单中有几个按钮(大约15个以上(。每个按钮名称都有自己的过滤器查询。

然后我检查点击了哪个按钮,然后将过滤器查询附加到我的实际SQL中,该SQL解析整个表。

我的代码

PHP:

if (isset($_POST['filter_type_pc'])) {
$newFilter = "WHERE type LIKE 'PC%' ORDER BY time_altered DESC";
} else if (isset($_POST['filter_type_mac'])) {
$newFilter = "WHERE type LIKE 'Mac%' ORDER BY time_altered DESC";
} else if (isset($_POST['filter_type_linux'])) {
$newFilter = "WHERE type LIKE 'Linux%' ORDER BY ip DESC";
//...
//there are more 'else if' statements, but I've excluded them to maintain a clean question
//...
} else {
$newFilter = "ORDER BY time_altered DESC";
}
$sql = "SELECT * FROM myTable $newFilter";
$stmt = $conn->prepare($sql);
$stmt->execute();
$result = $stmt->fetchAll();

值得注意的是,过滤器查询可能完全不同。我不仅仅使用WHERELIKE子句。

HTML:

<form id="filterTable" name="filter" method="POST" action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>">
<h5>Type of device</h5>
<button type="submit" class="btn btn-light filter_button" name="filter_type_pc">PC</button>
<button type="submit" class="btn btn-light filter_button" name="filter_type_mac">Mac</button>
<button type="submit" class="btn btn-light filter_button" name="filter_type_linux">Linux</button>
</form>

我的问题

为了澄清更多,我将提出一个问题。如果有的话,有什么比else if混乱更好、更干净的方法呢?我很想听听你的建议,因为我想从中学习,并从已经工作的代码中改进!

回答我自己的问题,这样任何像这样的未来访问者都可以了解到这个问题的简单解决方案。

$filters = array(
"filter_type_pc" => "My SQL query",
"filter_type_mac" => "My SQL query",
"filter_type_linux" => "My SQL query"
);
if (!empty($_POST)) {
$arrayMatch = array_intersect_key($_POST, $filters);
foreach(array_keys($arrayMatch) as $filterName) {
$newFilter = $filters[$filterName];
}
} else {
$newFilter = "ORDER BY time_altered DESC";
};

让我们来分解一下:

  • 首先我们检查$_POST请求是否为空,因为我们不知道使用PHP在DOM中点击了什么过滤器按钮,所以我们只将其留空
  • 因为我们检查了整个超全局变量,它将接受$_POST请求中的任何内容,如果您有几个请求,我们可以通过
  1. 使用与$_POST$filters阵列中的密钥匹配的array_intersect_key
  2. 创建仅包含匹配结果的新数组CCD_ 8
  • 然后,我们循环遍历新创建的具有foreach()array_keys()的数组的匹配密钥,然后为$filterName命名密钥
  • 最后,我们可以通过使用我们的新变量$filterName$newFilter定义为$filters数组的值来获得我们的数组的值

编辑:

我想出了一个比上面更好的解决方案,而上面的解决方案按预期工作——它可能会与前面提到的未来实现相冲突。这将修复此问题,并且只检查包含数组中密钥的POST请求。

$filters = array(
"filter_type_pc" => "My SQL query",
"filter_type_mac" => "My SQL query",
"filter_type_linux" => "My SQL query"
);
$newFilter = "ORDER BY time_altered DESC";
$arrayMatch = array_intersect_key($_POST, $filters);
foreach(array_keys($arrayMatch) as $filterName) {
if (isset($_POST[$filterName])) {
$newFilter = $filters[$filterName];
}
};

最新更新