PHP PDO MYSQL - 最简单的方法来比较数组查询并返回一个结果不是查询结果的数组?

时间:2014-10-08 12:50:24

标签: php arrays pdo compare

在PHP中,我有一个名为$allFiles的简单数组,如:

Array
(
    [0] => test1.csv
    [1] => test2.csv
    [2] => test3.csv
)

在MySQL中,我有一个表格,其值如下:

| ID | PROCESSED |
| 0  | test2.csv |

最简单的方法(使用PDO作为连接方法)将$allFiles与表进行比较并返回包含以下内容的新数组$newFiles

Array
(
    [0] => test1.csv
    [1] => test3.csv
)

(这些是MySQL中没有表示的文件)

我已阅读过手册,但似乎无法找到与此完全相关的任何内容,我可能已经错过了一些东西。任何意见都将非常感谢,谢谢!

3 个答案:

答案 0 :(得分:2)

PDO从表中返回一组值。您可以检查结果是否已存在于db数组中。您可以检查数组键,如果结果已经在PDO数组中,则跳过此结果。如果您的结果不在PDO数组中,则构建具有该值的新数组。

注意:PDO返回一条记录的nummeric和text键。检查密钥是否存在时,您必须检查密钥是否为数字密钥。如果是nummeric,请跳过那个。

答案 1 :(得分:2)

就像评论中的人说的那样,没有PDO功能可以完全做到这一点。您必须先收集结果,将它们放入数组并使用array_diff()

粗略的例子:

$allFiles = ['test1.csv', 'test2.csv', 'test3.csv'];

$con = new PDO('mysql:host=localhost;dbname=DATABASE', 'username', 'password');
$query = $con->query('SELECT PROCESSED FROM table_name');
$db_results = [];
while($row = $query->fetch(PDO::FETCH_ASSOC)) {
    $db_results[] = $row['PROCESSED'];
}

$results = array_diff($allFiles, $db_results);

答案 2 :(得分:2)

没有现成的功能来执行此操作。大多数情况下,您会发现您的问题没有开箱即用的解决方案。你必须自己编写代码,这不是太难:查询DB获取所有文件名,创建一个包含结果的数组,然后获得你拥有的数组之间的差异,以及查询结果 一个基本的例子是:

$stmt = $pdo->prepare('SELECT PROCESSED FROM db.table WHERE PROCESSED IN (?,?,?)');
$stmt->execute($allFiles);
$existing = array();
while($row = $stmt->fetch(PDO::FETCH_OBJ))
    $existing[] = $row->PROCESSED;//construct array containing existing values
$notFound = array_diff($allFiles, $existing);
var_dump($notFound);

您可以使用$allFiles数组的长度使查询更具动态性,并相应地添加?占位符:

$allFiles = array_filter(array_unique($allFiles));//clean array
$placeholders = array_fill(0, count($allFiles), '?');
$stmt = $pdo->prepare(
    'SELECT PROCESSED FROM db.table WHERE PROCESSED IN ('.implode(',', $placeholders).')'
);
//alternative:
$stmt = $pdo->prepare(
    'SELECT PROCESSED FROM db.table WHERE PROCESSED IN ('.
    substr(
        str_repeat('?,',count($allFiles)),//repeat ?, as many times as there are values
        0,-1//remove trailing ","
    ).')'
);
$stmt->execute(array_values($allFiles));//better safe than sorry
//rest is the same as before

这允许您处理任何长度的数组。