PHP foreach重复循环问题

PHP foreach重复循环问题,php,loops,duplicates,Php,Loops,Duplicates,因此,我有一个目录,在将每个文件的哈希值写入/添加到文本文档时,我得到了目录中所有文件的哈希值。我一直在文档中使用相同的哈希值10-100次,我不明白php为什么一直这样做 任何人都可以在windows上运行它,亲自查看脚本执行的certutil是内置在windows中的,因此它可以在任何windows机器上运行 <?php $file_path = 'C:\Users\C0n\Desktop\hash-banned.txt'; foreach (glob("R:\backup\Video

因此,我有一个目录,在将每个文件的哈希值写入/添加到文本文档时,我得到了目录中所有文件的哈希值。我一直在文档中使用相同的哈希值10-100次,我不明白php为什么一直这样做

任何人都可以在windows上运行它,亲自查看脚本执行的certutil是内置在windows中的,因此它可以在任何windows机器上运行

<?php
$file_path = 'C:\Users\C0n\Desktop\hash-banned.txt';
foreach (glob("R:\backup\Videos\*") as $filename) {
    exec('CertUtil -hashfile "'.$filename.'" SHA1', $response);
    $str = str_replace(' ', '', $response[1]);
    $find_hashes = file($file_path,FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
    foreach ($find_hashes as $n1) {
        if($str == $n1) {
            echo "duplicate detected";
            break;
        }
        echo "Hash does not exist so adding " . $str;
        //hash not found so add to file
        //if hash string is not empty then write to file
        if ($str != "") {
            file_put_contents($file_path, $str . "\n", FILE_APPEND);
        }
    }
}
?>

如果文件为空,$str是如何写入文件的?因为$find_散列也将为空,而foreach将不会运行。
测试了下面的代码,似乎与我的工作良好

    $str = sha1_file($filename);
    $find_hashes = file($file_path, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

    // unsetting response returned by certutil
    // because exec() appends output lines to the end of the array
    unset($response);

    if (in_array($str, $find_hashes)) {
        echo "duplicate detected";
        continue;       
    }

    if ($str != "") file_put_contents($file_path, $str . "\n", FILE_APPEND);            
    echo "Hash does not exist so adding " . $str;  

我在find_散列的第一行留下了一个空格,所以从技术上讲它不是空的。我之所以使用“certutil.exe”而不是php内置的sha1_文件,也是因为这些文件的大小超过2GB,php在windows上无法读取大于2GB的文件。@C0nw0nk我知道,我使用sha1_文件只是为了测试。您可以使用certutil.exe。它仍然会产生重复的散列吗?是的,这似乎已经完成了这个技巧,感谢JungleZombie:)非常困惑,以前从未遇到过这个问题。取消响应数组似乎已经完全解决了这个问题。我编辑了您的答案,以包括这段代码。是的,很高兴知道exec()没有重新分配数组,但是在它的末尾附加输出行。这实际上可能是您的第一个代码的问题:)您应该在每次迭代中取消设置$response。