【发布时间】:2019-03-07 03:52:40
【问题描述】:
我一直在这里做一些名称处理器,但我遇到了一些小问题。
我有包含名称和状态的 CSV 文件,仅按“Cool Ones”状态过滤它们,然后我正在查询 SQL,并获取我手动输入的另一个名称列表。 所以这里是代码示例,我在其中获取 CSV 文件、过滤器、查询 SQL,然后它创建数组、合并它并按字母顺序排序。
$nameFile = "names/$eid.csv";
$content = array_map('str_getcsv', file($nameFile));
$filteredData = array_filter($content, function($v){
return $v['1'] === 'Cool Ones'; },ARRAY_FILTER_USE_BOTH); //because in this file there are also 'Not Cool Ones'
$freePeople = array();
$sth = $DBcon->prepare("SELECT guestName, guestType FROM guestList WHERE forEvent = '$eid' ORDER BY 'guestName'");
$sth->execute();
$result2 = $sth->fetchAll(PDO::FETCH_NUM);
$listNames = array();
foreach($result2 as $row) {
$listNames[] = $row['0'];
$freeGuestName = $row['0'];
$freeGuestType = $row['1'];
}
$merged = array_merge($filteredData, $result2);
$sortedGuests = usort($merged, "sortGuestNames");
所以我的问题在于,当输出数组时,我得到了重复的结果,
[50] => Array
(
[0] => John Down
[1] => Best Ones
)
[51] => Array
(
[0] => John Down
[1] => Cool Ones
)
不知道接下来会发生什么 - 如果我查询的名称与第一个 CSV 文件中的名称相同,那么隐藏这个并显示我的。
我试图取消设置密钥
foreach($merged[$i]['0'] as $key => $value) {
if (in_array($merged[$i]['0'], $value)) {
unset($merged[$i]['0'][$key]);
}
}
但没有运气,仍然输出重复。
您可以提出更好的方法。 我想过 - 也许打开 CSV,查询 SQL 并找到我的手动名称 - 在打开的 CSV 字段中查找,在此处附加我的状态,合并并将它们推送到 SQL 数据库或新的 CSV 文件,在那里它可以被输出。
非常感谢!
【问题讨论】:
-
你能把你的both数组以json格式给我们吗?
-
警告:使用 PDO 时,您应该使用带有占位符值的 prepared statements,并将任何用户数据作为单独的参数提供。在此代码中,您可能有严重的SQL injection bugs。永远不要使用字符串插值或连接,而是使用 prepared statements 并且永远不要将
$_POST、$_GET或任何用户数据直接放在查询中。有关一般指导和建议,请参阅 PHP The Right Way。 -
非常感谢朋友们的关心!我首先对 $eid 进行了消毒。我是一个周日的编码员,但我需要做更好的技术。
-
$newArray = array_unique( array_merge($arr_1, $arr_2));试试这个.. -
一些提示将
$sth->fetchAll(PDO::FETCH_NUM)更改为$sth->fetchAll(PDO::FETCH_GROUP)并添加GROUP BY guestName无论如何你都会丢失表格中的任何重复项,然后对于csv,你可以使用array_column($data,null,0)Example这些应该让你接近你所需要的,结构明智。