【问题标题】:PHP foreach duplicate looping issuePHP foreach重复循环问题
【发布时间】:2015-09-21 20:13:46
【问题描述】:

所以我有一个目录,我在将每个文件的哈希写入/添加到文本文档时获取目录中所有文件的哈希,我在文档中一直以相同的哈希结束 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);
        }
    }
}
?>

【问题讨论】:

    标签: php loops duplicates


    【解决方案1】:

    如果文件为空,$str 最终如何写入文件?因为 $find_hashes 也将是空的并且 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_hashes 的第一行留了一个空格,所以它在技术上不是空的。另外我使用“certutil.exe”而不是php内置的sha1_file的原因是因为文件大小超过2GB,php无法在windows上读取大于2GB的文件。
    • @C0nw0nk 我了解,我使用 sha1_file 只是为了测试目的。您可以使用 certutil.exe。它还会产生重复的哈希吗?
    • 是的,这似乎已经成功了,谢谢 JungleZombie :) 之前从未遇到过这个问题。
    • 取消设置响应数组似乎已经完全修复了它,因为我编辑了你的答案以包含那段代码。
    • 是的,很高兴知道 exec() 不是重新分配数组,而是将输出行附加到它的末尾。这实际上可能是您的第一个代码的问题:) 您应该在每次迭代时取消设置 $response。
    猜你喜欢
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 2013-12-10
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2014-05-13
    • 2015-10-30
    相关资源
    最近更新 更多