php实现diff
PHP实现文本差异比较(Diff)
PHP提供了多种方式实现文本差异比较,以下是几种常见方法:
使用内置函数array_diff() 适用于简单数组差异比较,返回在第一个数组中但不在其他数组中的值:
$array1 = ['a', 'b', 'c'];
$array2 = ['a', 'd', 'e'];
$diff = array_diff($array1, $array2); // 返回 ['b', 'c']
使用PEAR的Text_Diff包 需先安装PEAR库,提供更专业的文本差异比较:
require_once 'Text/Diff.php';
require_once 'Text/Diff/Renderer/inline.php';
$text1 = "old line1\nold line2";
$text2 = "new line1\nnew line2";
$diff = new Text_Diff('auto', [explode("\n", $text1), explode("\n", $text2)]);
$renderer = new Text_Diff_Renderer_inline();
echo $renderer->render($diff);
使用xdiff扩展 需安装xdiff扩展,支持文件级差异比较:

$file1 = "old_file.txt";
$file2 = "new_file.txt";
$diff = xdiff_file_diff($file1, $file2, 'diff.txt', 2);
自定义实现(简单版) 基于LCS(最长公共子序列)算法的简单实现:
function computeDiff($old, $new) {
$matrix = [];
$maxlen = 0;
foreach($old as $oindex => $ovalue) {
foreach($new as $nindex => $nvalue) {
if($ovalue == $nvalue) {
$matrix[$oindex][$nindex] = isset($matrix[$oindex-1][$nindex-1])
? $matrix[$oindex-1][$nindex-1] + 1
: 1;
if($matrix[$oindex][$nindex] > $maxlen) {
$maxlen = $matrix[$oindex][$nindex];
}
}
}
}
// 根据矩阵回溯生成差异结果
// [...]
}
高级Diff实现建议
使用SebastianBergmann/diff组件 通过Composer安装的专业Diff库:
composer require sebastian/diff
使用示例:

use SebastianBergmann\Diff\Differ;
$differ = new Differ();
echo $differ->diff('old text', 'new text');
Git风格输出 生成类似git diff格式的输出:
$diff = new SebastianBergmann\Diff\Differ("--- Original\n+++ New\n");
echo $diff->diff($oldString, $newString);
性能优化建议
对于大文件比较,建议:
- 使用流处理而非一次性加载全部内容
- 考虑使用xdiff扩展处理二进制差异
- 对结果进行缓存处理
可视化差异输出
生成HTML格式的差异高亮显示:
use SebastianBergmann\Diff\Differ;
use SebastianBergmann\Diff\Output\UnifiedDiffOutputBuilder;
use SebastianBergmann\Diff\Output\StrictUnifiedDiffOutputBuilder;
$builder = new StrictUnifiedDiffOutputBuilder([
'collapseRanges' => true,
'commonLineThreshold' => 0.5
]);
$differ = new Differ($builder);
$diff = $differ->diff($old, $new);






