用php合并文件

时间:2014-04-01 17:23:14

标签: php

所以,我有两个文件 在第一个文件中,有 文本:散列

在另一个文件中有 散列:通

我写了一些代码来匹配哈希,然后打印文本(所以当运行时,我得到一个文本输出:传递) 它工作正常,它找到所有的信息,但有时它会跳过某些信息,只是找不到任何东西。 (如果我去手工做数据就在那里)所以我不确定为什么它会找到大部分而不是全部。无论如何,我希望有人可以提供帮助,代码如下:

<?php
$emailhash = file('emailhash.txt');
$hashpass = file('hashpass.txt');
$list = '';

foreach($emailhash as $data) {
    $data = str_replace("\r\n",'', $data);
    $array_emailhash = explode(":", $data);
    $email = $array_emailhash[0];
    $hash = $array_emailhash[1];

    foreach($hashpass as $data2) {
        $data2 = str_replace("\r\n",'', $data2);
        $array_hashpass = explode(":", $data2);
        $hash2 = $array_hashpass[0];
        $pass = $array_hashpass[1];

        if($hash2 == $hash)
            $list .= $email.':'.$pass."\r\n";

    }
}

file_put_contents('emailpass.txt', $list);

2 个答案:

答案 0 :(得分:0)

您需要迭代迭代器,例如使用multipleIterator,因为您将整个文件读入数组,请执行此操作。

$iterator = new MultipleIterator();
$iterator->attachIterator( new ArrayIterator( $emailhash ));
$iterator->attachIterator( new ArrayIterator( $hashpass ));

foreach( $iterator as $value ) {
    list($keys1, $keys2) = $iterator->key();
    list($value1, $value2) = $value;
}

看看这个 - &gt; http://br1.php.net/MultipleIterator

答案 1 :(得分:0)

此算法效率很低。试着这样做

$ emailhash = file('emailhash.txt');    $ hashpass = file('hashpass.txt');    $ hashToEmail = array();    $ list ='';

foreach($emailhash as $data) {
    $data = str_replace("\r\n",'', $data);
    $array_emailhash = explode(":", $data);
    $email = $array_emailhash[0];
    $hash = $array_emailhash[1];

    $hashToEmail[$hash] = $email;
}

foreach($hashpass as $data2) {
    $data2 = str_replace("\r\n",'', $data2);
    $array_hashpass = explode(":", $data2);
    $hash2 = $array_hashpass[0];
    $pass = $array_hashpass[1];
    if (array_key_exists($hash2, $hashToEmail)) {
        $list .= $hashToEmail[$hash2].':'.$pass."\r\n";
    } else {
        //what to do if you don't have that password hash
    }
}

您的设计具有n ^ 2的大O复杂度[对于1000行,将需要1 000 000次迭代] 没有嵌套foreach的那个具有2n的复杂性。 [需要2000次迭代]。尝试找到解决方案:)

无论如何,在这两个地方都有一个问题,因为你可以有一个哈希冲突(对于两个不同的电子邮件,你可以有相同的哈希,然后对于所有电子邮件,你将打印出相同的(可能是错误的密码)。