Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较两个csv文件PHP的数据_Php_Arrays_Loops_Csv - Fatal编程技术网

比较两个csv文件PHP的数据

比较两个csv文件PHP的数据,php,arrays,loops,csv,Php,Arrays,Loops,Csv,现在这是我的代码。我被困在如何查找/比较payment.csv和transactions.csv的数据上 <?php //this shows the name, email, deposit date and amount from payment.csv $data = file("data/payment.csv"); foreach ($data as $deposit){ $depositarray

现在这是我的代码。我被困在如何查找/比较payment.csv和transactions.csv的数据上

<?php
        //this shows the name, email, deposit date and amount from payment.csv

          $data = file("data/payment.csv");
          foreach ($data as $deposit){
            $depositarray = explode(",", $deposit);
            $depositlist = $depositarray;
            $name = $depositlist[0];
            $email = $depositlist[1];
            $depositdate = $depositlist[9]; 
            $depositamount = $depositlist[10];

            //echo $depositamount;
        }

        //this shows the payment date and amount from transaction.csv

        $databank = file("datas/transactions.csv");
          foreach ($databank as $payment){
            $paymentarray = explode(",", $payment);
            $paymentlist = $paymentarray;

            $paymentdate = $paymentlist[0];
            $paymentamount =  $paymentlist[5];

            //echo $paymentamount;

        }
?>
例如:

从payment.csv开始,每个$depositdate&&$depositamount将与transactions.csv$paymentdate&&$paymentamount进行比较

匹配的每一行将保存到一个数组中,然后显示在表中。如果不匹配,则保存到数组并稍后显示

有谁能帮我或给我一个想法来完成这件事吗?只需显示包含匹配数据的所有行

或者像这样:

当一个事务有多个匹配项时,这应该是输出

根据@Ryan Vincent的评论:

<?php
  $masterData = array();

  //this shows the name, email, deposit date and amount from payment.csv
  $data = file("data/payment.csv");
  foreach ($data as $deposit){
    $depositarray = explode(",", $deposit);
    $key = md5($depositlist[9] . $depositlist[10]); //date + amount
    $depositlist = $depositarray;

    $masterData[$key]['payment'] = array(
      'name' => $depositlist[0],
      'email' => $depositlist[1],
      'depositdate' => $depositlist[9],
      'depositamount' => $depositlist[10]
    );
  }

  //this shows the payment date and amount from transaction.csv
  $databank = file("datas/transactions.csv");
  foreach ($databank as $payment){
    $paymentarray = explode(",", $payment);

    $key = md5($paymentlist[0] . $paymentlist[5]); //date + amount

    $masterData[$key]['transaction'] = array(
      'paymentdate' => $paymentlist[0],
      'paymentamount' =>  $paymentlist[5]
    );
  }
?>
您应该让每一行都包含您的数据,并在有交易时在a行的末尾进行匹配


但正如我所说,因为人们可以在同一天进行相同金额的交易,所以你不知道哪个交易属于哪个人。

根据@Ryan Vincent的评论:

<?php
  $masterData = array();

  //this shows the name, email, deposit date and amount from payment.csv
  $data = file("data/payment.csv");
  foreach ($data as $deposit){
    $depositarray = explode(",", $deposit);
    $key = md5($depositlist[9] . $depositlist[10]); //date + amount
    $depositlist = $depositarray;

    $masterData[$key]['payment'] = array(
      'name' => $depositlist[0],
      'email' => $depositlist[1],
      'depositdate' => $depositlist[9],
      'depositamount' => $depositlist[10]
    );
  }

  //this shows the payment date and amount from transaction.csv
  $databank = file("datas/transactions.csv");
  foreach ($databank as $payment){
    $paymentarray = explode(",", $payment);

    $key = md5($paymentlist[0] . $paymentlist[5]); //date + amount

    $masterData[$key]['transaction'] = array(
      'paymentdate' => $paymentlist[0],
      'paymentamount' =>  $paymentlist[5]
    );
  }
?>
您应该让每一行都包含您的数据,并在有交易时在a行的末尾进行匹配


但正如我所说的,因为人们可以在同一日期进行相同金额的交易,所以你不知道哪个交易属于哪个人。

首先,如果它是有效的csv文件,你应该通过fgetcsv解析数据,而不是依赖于字符串中没有逗号

您可以在读取csv1时为存款日期创建索引数组,并在读取csv2时简单地查找此索引。如果有匹配的日期,请比较金额并继续

大概是这样的:

// read csv1, store in array and create index
$data = array();
$fh = fopen($csv1, 'r');
while($row = fgetcsv($fh)) {
  $data[] = $row;
  $val = $row[$interestd_in];
  $key = count($data) - 1;
  $idx[$val][] = $key;      // array containing all indices
}
fclose($fh);

// read csv2, lookup in index and process further
$fh = fopen($csv2, 'r');
while($row2 = fgetcsv($fh)) {
  $val = $row2[$interest2];
  if(!empty($idx[$val])) {
    foreach($idx[$val] as $key) {
      $row1 = $data[$key];
      /*
    do your further comparisons of these 2 data-lines
    and output, if matches found
       */
    }
  }
}
fclose($fh);

首先,如果它是有效的csv文件,那么应该通过fgetcsv解析数据,而不是依赖字符串中没有逗号

您可以在读取csv1时为存款日期创建索引数组,并在读取csv2时简单地查找此索引。如果有匹配的日期,请比较金额并继续

大概是这样的:

// read csv1, store in array and create index
$data = array();
$fh = fopen($csv1, 'r');
while($row = fgetcsv($fh)) {
  $data[] = $row;
  $val = $row[$interestd_in];
  $key = count($data) - 1;
  $idx[$val][] = $key;      // array containing all indices
}
fclose($fh);

// read csv2, lookup in index and process further
$fh = fopen($csv2, 'r');
while($row2 = fgetcsv($fh)) {
  $val = $row2[$interest2];
  if(!empty($idx[$val])) {
    foreach($idx[$val] as $key) {
      $row1 = $data[$key];
      /*
    do your further comparisons of these 2 data-lines
    and output, if matches found
       */
    }
  }
}
fclose($fh);

要求:查找并记录与相应主记录匹配的交易记录

必须保留与主记录匹配的所有交易记录的列表

比较基于“日期”和金额。更新后,当您传递要使用的“列名”数组时,可以方便地允许当前行中的任何值

问题是,如果数组没有按要比较的键进行排序,那么这可能会非常昂贵

一种方法是生成一个“键”,该键对于每个“数据键字段”都是唯一的,但很容易生成,并且大小固定,便于比较

然后使用这些“键”生成原始记录的“已生成键”的查找数组

这样就不必提供要比较的字段的排序数据。但是,生成的查找数组必须适合内存

我决定对连接的数据键使用MD5哈希。在此应用中,碰撞的机会并不重要。MD5在生成唯一散列方面非常出色。它也很快

完成该工作的类: 解释 运行它的代码: 测试数据
要求:查找并记录与相应主记录匹配的交易记录

必须保留与主记录匹配的所有交易记录的列表

比较基于“日期”和金额。更新后,当您传递要使用的“列名”数组时,可以方便地允许当前行中的任何值

问题是,如果数组没有按要比较的键进行排序,那么这可能会非常昂贵

一种方法是生成一个“键”,该键对于每个“数据键字段”都是唯一的,但很容易生成,并且大小固定,便于比较

然后使用这些“键”生成原始记录的“已生成键”的查找数组

这样就不必提供要比较的字段的排序数据。但是,生成的查找数组必须适合内存

我决定对连接的数据键使用MD5哈希。在此应用中,碰撞的机会并不重要。MD5在生成唯一散列方面非常出色。它也很快

完成该工作的类: 解释 运行它的代码: 测试数据
您没有连接这些数据的密钥或id吗?如果两个交易的日期和金额相同,该怎么办?但对于你的问题——我想一种方法是将第二个foreach放到第一个foreach中——这可能是一种时间/资源密集型方法。但是你可以将每一行与每一行进行比较。或者你们两个。@Jurik,是的,我没有钥匙/身份证。你介意给我参考吗?是的,这就是我想要完成的。如果两个交易记录的日期和金额相同,则显示所有交易记录。请检查我的附加照片。谢谢。主文件是payment.csv。如果有匹配项,只需将每一行查找到transactions.csv即可。如果不是那么清楚的话,那就乌云密布

。一旦它们存储在单独的数组中,我会添加一个可以轻松检查的密钥。我会使用存款日期和金额的MD5散列。因此,传递主文件并生成密钥,使用哈希的密钥创建另一个数组$masterHash。现在,向下传递生成MD5哈希添加的事务文件,查看它是否存在于$masterHash中。如果是,你有一个匹配。这将是快速的,因为它只是两个连续的过程和查找开销。工作代码:-将很快发布答案-去喝咖啡:你没有连接这些数据的密钥或id?如果两个交易的日期和金额相同,该怎么办?但对于你的问题——我想一种方法是将第二个foreach放到第一个foreach中——这可能是一种时间/资源密集型方法。但是你可以将每一行与每一行进行比较。或者你们两个。@Jurik,是的,我没有钥匙/身份证。你介意给我参考吗?是的,这就是我想要完成的。如果两个交易记录的日期和金额相同,则显示所有交易记录。请检查我的附加照片。谢谢。主文件是payment.csv。如果有匹配项,只需将每一行查找到transactions.csv即可。如果不是很清楚的话,那就麻烦了。一旦它们存储在不同的数组中,我会添加一个我可以轻松检查的密钥。我会使用存款日期和金额的MD5散列。因此,传递主文件并生成密钥,使用哈希的密钥创建另一个数组$masterHash。现在,向下传递生成MD5哈希添加的事务文件,查看它是否存在于$masterHash中。如果是,你有一个匹配。这将是快速的,因为它只是两个连续的过程和查找开销。工作代码:-将很快发布答案-去喝咖啡:哇!谢谢你。希望能成功。现在就开始吧。我附上了照片。请查收。有可能吗?有可能在数组中显示/存储具有多个匹配的事务吗?示例:与交易1、3、5匹配的付款。。等等。目的是查看交易中付款的所有可能匹配项。是的,这是可能的,当您将$masterData[$key]['transaction']=array更改为$masterData[$key][]=array时,您可以将其存档。嘿,伙计,我正在尝试运行您的示例代码。其工作正常,但其他列表不会显示在阵列上。问题是使用md5数据和金额的密钥,用户可能有相同的日期和金额,因此密钥不是唯一的。你有办法解决这个问题吗?如果用户A、B和C具有相同的付款日期和金额键,则应显示相同的交易记录。希望收到你的来信。谢谢,哇!谢谢你。希望能成功。现在就开始吧。我附上了照片。请查收。有可能吗?有可能在数组中显示/存储具有多个匹配的事务吗?示例:与交易1、3、5匹配的付款。。等等。目的是查看交易中付款的所有可能匹配项。是的,这是可能的,当您将$masterData[$key]['transaction']=array更改为$masterData[$key][]=array时,您可以将其存档。嘿,伙计,我正在尝试运行您的示例代码。其工作正常,但其他列表不会显示在阵列上。问题是使用md5数据和金额的密钥,用户可能有相同的日期和金额,因此密钥不是唯一的。你有办法解决这个问题吗?如果用户A、B和C具有相同的付款日期和金额键,则应显示相同的交易记录。希望收到你的来信。谢谢。我刚刚遇到一些键相同的行不存在。问题在于关键日期和金额可以重复。如果两个或多个用户具有相同的日期和金额,则只有第一个用户会显示其他用户不会显示,因为密钥已存在。您能帮助我如何显示其他数据/用户吗?ThanksIt已经为匹配的主记录维护了类似的列表:我只是没有添加代码来显示它们。我将添加它并用新代码更新pastebin。很快,谢谢!你能逐行解释一下代码吗?其中一些但不是全部。我现在遇到的是,具有相同键的某些行不存在。问题在于关键日期和金额可以重复。如果两个或多个用户具有相同的日期和金额,则只有第一个用户会显示其他用户不会显示,因为密钥已存在。您能帮助我如何显示其他数据/用户吗?ThanksIt已经为匹配的主记录维护了类似的列表:我只是没有添加代码来显示它们。我将添加它并用新代码更新pastebin。很快,谢谢!你能逐行解释一下代码吗?其中一些,但不是全部。
later....
// !!!! You can pass the names of the fields to be used to generate the key 
$match = new HashMatch($master, 
                       $transaction, 
                       array('whenDone', 'amount'));
$match->generateMatches();


// print output...
echo '<pre>Hash Master Records with multiple Matching Masters ... ', PHP_EOL;
    print_r($match->getHashMatchedMasterList());
echo '</pre>';    
Matching Master to Transaction... 
Array
(
    [key] => 296099e19b77aad413600a1e2f2cb3cd
    [master] => Array
        (
            [0] => Array
                (
                    [name] => John Matched
                    [whenDone] => 2016-04-01
                    [amount] => 12345
                    [email] => johnMatched@y.com
                )

            [1] => Array
                (
                    [name] => Jane Matched
                    [whenDone] => 2016-04-01
                    [amount] => 12345
                    [email] => janeMatched@y.com
                )

        )

    [transaction] => Array
        (
            [0] => Array
                (
                    [name] => John Doe
                    [whenDone] => 2016-04-01
                    [amount] => 12345
                    [email] => johndoe@y.com
                )

            [1] => Array
                (
                    [name] => micky mean
                    [whenDone] => 2016-04-01
                    [amount] => 12345
                    [email] => mickym@y.com
                )
        )
)
$master[]      = array('name' => 'First last',     'whenDone' => '2016-03-03', 'amount' => 12000,  'email' => 'sample@y.com', );
$master[]      = array('name' => 'John Matched',   'whenDone' => '2016-04-01', 'amount' => 12345,  'email' => 'johnMatched@y.com');
$master[]      = array('name' => 'Jane Unmatched', 'whenDone' => '2016-05-02', 'amount' => 12345,  'email' => 'janeUnmatched@y.com');
$master[]      = array('name' => 'Jane Matched',   'whenDone' => '2016-04-01', 'amount' => 12345,  'email' => 'janeMatched@y.com');

$transaction[] = array('name' => 'Mary Lamb',      'whenDone' => '2016-03-04', 'amount' => 12000,  'email'  => 'maryl@y.com');
$transaction[] = array('name' => 'John Doe',       'whenDone' => '2016-04-01', 'amount' => 12345,  'email' => 'johndoe@y.com');
$transaction[] = array('name' => 'micky mean',     'whenDone' => '2016-04-01', 'amount' => 12345,  'email'  => 'mickym@y.com');