如何通过使用PHP比较两个文件来找到额外的行?

时间:2012-02-23 16:43:52

标签: php file-manipulation file-comparison

我有两个文件。

第一个有482行。 第二个只有519行。

我想通过使用php比较两个文件来找到额外的行。

假设我的第一个文件有这样的行

Mango
Orange
Cherry
Apple 
Blackberry

让我说我的第二个文件看起来像这样

Apple 
Orange
Mango
Banana
Cherry
Blackberry

请注意:这些行是随机排列的。现在我想使用PHP脚本删除相同的行并保留额外的行。例如,文件1包含行Mango。文件2也包含该行,但是以随机顺序排列。所以我想删除那一行。

7 个答案:

答案 0 :(得分:4)

将每个文件加载到字符串数组中(例如,使用file_get_contents)。

执行一些循环,对于数组2中的每个项目,确定该项目是否存在于数组1中。如果是,请从数组2中删除该项目并继续。

完成后,数组2将只包含唯一的行。

修改

如果您只想删除File2中也存在于File1中的行,那么您正在寻找唯一值(顺序无关紧要)。快速执行此操作的方法是使用array_diff函数。

以下是一个例子:

$file1 = array('Mango', 'Orange', 'Cherry', 'Apple', 'Blackberry');
$file2 = array('Apple', 'Orange', 'Mango', 'Banana', 'Cherry', 'Blackberry');

$diff = array_diff($file2, $file1);

var_dump($diff);

// Output
array
    3 => string 'Banana' (length=6)

如果您喜欢使用我在第一部分中提到的循环手动执行此操作,请按以下步骤操作:

// Loop over every value in file2
for($i = count($file2) - 1; $i >= 0; $i--)
{
    // Compare to every value in file1; if same, unset (remove) it
    foreach($file1 as $v)
        if ($v == $file2[$i])
        {
            unset($file2[$i]);
            break;
        }
}
// Reindex the array to remove gaps
$output = array_values($file2);
var_dump($output);

// Output
array
    0 => string 'Banana' (length=6)

答案 1 :(得分:1)

我采用了JYelton建议的相同方法。

在这里演示:http://codepad.org/lCa68G76

<?

$file1 = array(
    'Mango',
    'Orange',
    'Cherry',
    'Apple',
    'Blackberry'
);

$file2 = array(
    'Apple',
    'Orange',
    'Mango',
    'Banana',
    'Cherry',
    'Blackberry'
);


foreach($file2 as $line)
{
    if (!in_array($line, $file1))
    {
        $output[] = $line;
    }
}

var_dump($output);


?>

答案 2 :(得分:0)

通过将每个文件的行读入一个列表来制作两个列表,然后比较它们。浏览list1并删除list2中找不到的所有项目,反之亦然。

答案 3 :(得分:0)

答案 4 :(得分:0)

<?php

$testOne = 'Apple Orange Carrot Banana';
$testTwo = 'Apple Orange Carrot';

$tTwo = explode(' ', $testTwo);
$tOne = explode(' ', $testOne);

foreach($tOne as $first) {
    foreach($tTwo as $second) {
        if ($second == $first) {
            echo 'Both arrays contain: ' . $second . '</br>';
        }       
    }
}

?>

检查两个数组是否都包含值。

答案 5 :(得分:0)

这是否需要使用PHP脚本完成?你可以很容易地在bash中实现这个目标:

cat file1 file2 | sort | uniq > uniques.txt

答案 6 :(得分:0)

// read in both files
$file1 = file($filename1);
$file2 = file($filename2);

// calculate the entries that are in both files
$inBothFiles = array_intersect($file1, $file2);

// filter elements found in both files from file2 
$newFile2 = array_diff($file2, $inBothFiles);