PHP foreach重复循环问题
因此,我有一个目录,在将每个文件的哈希值写入/添加到文本文档时,我得到了目录中所有文件的哈希值。我一直在文档中使用相同的哈希值10-100次,我不明白php为什么一直这样做 任何人都可以在windows上运行它,亲自查看脚本执行的certutil是内置在windows中的,因此它可以在任何windows机器上运行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
<?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。